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

thigvfpy  于 2023-05-30  发布在  Windows
关注(0)|答案(3)|浏览(182)

我有一个批处理文件,它试图运行以下命令:

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

这个问题与"format:"周围的引号有关。
我试过用""来转义它们,但没有用。我也试过^。我尝试使用usebackq参数。
如果去掉--pretty="format:"参数,这个循环也可以工作,但是我会插入一堆额外的文本。

14ifxucb

14ifxucb1#

您可以重定向输出,这应该不会导致问题:

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的文件,然后在完成后删除它,应该可以实现这一点。

06odsfpq

06odsfpq2#

正确答案在Eryk Sun的评论中:需要转义=。所以命令应该是:

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

这应该可以工作(与原始的唯一区别是^=而不是=)。

efzxgjgh

efzxgjgh3#

在PowerShell中,这应该非常简单

foreach ($f in git show --pretty="format:" --name-only 54173344ab18a7d8e9ff2614cca62b671c8c7e2a) { $f }

相关问题