【问题标题】:How to run a command in a batch file that contains quotes ( "" )?如何在包含引号(“”)的批处理文件中运行命令?
【发布时间】:2014-12-25 19:03:32
【问题描述】:

我有一个批处理文件正在尝试运行以下内容:

FOR /F "tokens=1" %%G IN ('git show --pretty="format:" --name-only 54173344ab18a7d8e9ff2614cca62b671c8c7e2a') DO echo %%G 

这会导致 git 错误“fatal: Invalid object name 'format'.”

但是,如果我只是将命令本身放在批处理文件中,我会得到预期的输出。

git show --pretty="format:" --name-only 54173344ab18a7d8e9ff2614cca62b671c8c7e2a

生产:

Files/MyFiles/header.html
Files/MyFiles/foo.html

问题与“格式:”周围的引号有关。

我尝试使用“”转义它们,但无济于事。我也试过^。我试过使用 usebackq 参数。

如果你去掉 --pretty="format:" 参数,这个循环也可以工作,但是我会插入一堆额外的文本。

【问题讨论】:

  • 尝试使用FOR /F "usebackq tokens=1...,然后在git 命令周围使用反引号。反引号就像您当前拥有的单引号,但相反。
  • 您需要对命令中的= 字符进行转义,例如--pretty^="format:"。否则我认为没关系。
  • 为了看到这一点,我在调试器 (cdb cmd /c test.cmd) 下运行了一个测试批次,并设置了一个断点 (bp kernel32!CreateProcessW) 来检查生成子进程的命令行(第二个 x64 参数:@987654330 @)。
  • 我发现答案与@eryksun 解释的一样。引用等号 (=) 解决了这个问题。

标签: windows powershell batch-file


【解决方案1】:

您可以重定向不会导致问题的输出:

git show --pretty="format:" --name-only 54173344ab18a7d8e9ff2614cca62b671c8c7e2a >> out.tmp
FOR /F "tokens=1" %%G IN (out.tmp) DO echo %%G
del out.tmp

这应该可以通过将输出重定向到一个名为 out.tmp 的文件,然后在完成后将其删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-06
    • 1970-01-01
    • 2018-02-14
    • 2011-04-10
    • 2016-04-27
    • 2019-09-26
    • 1970-01-01
    • 2016-01-30
    相关资源
    最近更新 更多