批处理文件:如果路径中有空格,FOR /F 命令无法工作

15

这是我遇到的问题:

@ECHO OFF

REM If this batch file is run in the same directory as "command.exe" then the
REM following line will work.
FOR /F "usebackq" %%A IN (`command.exe "C:\File Being Passed as a Parameter.txt"`) DO ECHO %%A

REM The following line does not work no matter where this batch file is run.
FOR /F "usebackq" %%A IN (`"C:\Folder With Spaces\command.exe" "C:\File Being Passed as a Parameter.txt"`) DO ECHO %%A

我想把这个批处理文件存储在任何我想要的地方,而不被强迫将其存储在与command.exe相同的文件夹中。 有什么建议吗?

3个回答

29

在程序名之前添加CALL

FOR /F "usebackq" %%A IN (`CALL "C:\Folder With Spaces\command.exe" "C:\File Being Passed as a Parameter.txt"`) DO ECHO %%A

1
为什么要在EXE文件中使用call命令? - jeb
4
在这种情况下,为了解决问题,需要采用一些特定的方法。 - Andriy M
你是对的,我测试了一下,似乎只有使用 call 的方式才有效。 - jeb

13

Andriy Mcall技巧非常巧妙且有效,但我试图理解这个问题。

这个问题是由cmd.exe引起的,正如你可以在cmd /help中读到的那样:

......当行中没有恰好两个引号时,第一个和最后一个引号将被移除。
......

所以还有另一种解决方案,只需添加两个额外的引号即可。

FOR /F "usebackq=" %%A IN (`""C:\Folder Space\myCmd.exe" "Param space""`) DO (
    ECHO %%A
)

完全正确!这里只是添加了一些示例。这个可以工作:FOR /F "usebackq" %A IN (cmd.exe /C "findstr.exe" /?) DO @ECHO %A(仅在一个参数周围加引号)。这也可以工作:FOR /F "usebackq" %A IN ("cmd.exe" /C findstr.exe /?) DO @ECHO %A(仅在命令周围加引号)。直到另一对双引号被添加,就像你建议的那样,这个不会工作:FOR /F "usebackq" %A IN ("cmd.exe" /C "findstr.exe" /?) DO @ECHO %a - Andriy M
1
不需要使用USEBACKQ,最好使用'^""c:\folder space\myCmd.exe" "param with ^poison char"^"',这样可以正确地引用毒瘤字符。 - dbenham
因此,使用引号作为最佳实践似乎总是安全的。这也可以避免你不得不转义管道符。 - Squashman

3

注意:

使用“call”(如Andriy M所示)似乎是最安全的选项。

我发现添加前导和尾随双引号(如jeb建议的可能解决方案)存在问题。

问题:

for /f "delims=" %%i in ('""C:\path with spaces\hello.bat" "filename with an & ampersand.jpg""') do ( echo output=%%i )

cmd.exe的输出:&在此时不应出现。

解决方案:

for /f "delims=" %%i in ('call "C:\path with spaces\hello.bat" "filename with an & ampersand.jpg"') do ( echo output=%%i )


1
没错,其他字符如()也可能导致问题。这很容易发生在像C:\Program Files (x86)\...这样的路径中。 - C. Yduqoli

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