如何在包含引号("")的批处理文件中运行命令?

6

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

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

这会导致 git 错误 致命错误:无效的对象名称 'format'

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

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

生成:

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

问题与"format:"周围的引号有关。

我尝试使用""进行转义,但无济于事。我还尝试了^。我尝试使用usebackq参数。

如果您删除--pretty="format:"参数,则此循环也可以正常工作,但是这样会插入大量额外的文本。


尝试使用 FOR /F "usebackq tokens=1...,然后在你的 git 命令周围使用反引号。这些反引号类似于你目前使用的单引号,但是倾斜的方向相反。 - Mark Setchell
2
你需要在命令中转义 = 字符,例如 --pretty^="format:"。否则我认为它是可以的。 - Eryk Sun
为了查看这个问题,我在调试器下运行了一个测试批处理文件(cdb cmd /c test.cmd),并设置了一个断点(bp kernel32!CreateProcessW)来检查生成子进程的命令行(第二个x64参数:du @rdx)。 - Eryk Sun
我发现答案就像@eryksun所解释的那样。引用等号(=)解决了这个问题。 - John Rocha
3个回答

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的文件,然后在使用完毕后删除它来实现。


0
正确答案在Eryk Sun 的评论中:等号需要被转义。因此,命令应该是:
FOR /F "tokens=1" %%G IN ('git show --pretty^="format:" --name-only 54173344ab18a7d8e9ff2614cca62b671c8c7e2a') DO echo %%G 

这样应该可以工作(与原始代码唯一的区别是使用^=代替=)。


0
在PowerShell中,这应该非常简单。
foreach ($f in git show --pretty="format:" --name-only 54173344ab18a7d8e9ff2614cca62b671c8c7e2a) { $f }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接