批处理:在for循环中使用引号执行命令,并使用管道进行查找

时间:2012-08-01 08:06:18

标签: batch-file cmd

您能否告知如何修复下面的命令,从svn中删除未版本的项目

rem @echo off
for /f "tokens=2*" %%i in ('"c:\Program Files\TortoiseSVN\bin\svn.exe" status --no-ignore ^| find "?"') do echo %%i
下面没有路径的

变种:

rem @echo off
for /f "tokens=2*" %%i in ('svn.exe status --no-ignore ^| find "?"') do echo %%i

但我需要使用svn.exe传递整个路径。在这种情况下,它输出C:\ Program不是有效的程序

3 个答案:

答案 0 :(得分:4)

试试这个:

   for /f "usebackq tokens=2*" %%i in (`"c:\Program Files\TortoiseSVN\bin\svn.exe" status --no-ignore ^| find "?"`) do echo %%i

答案 1 :(得分:0)

当我遇到这个问题时,我尝试使用" usebackq"正如Windows命令参考[1]中建议的那样:

  

指定将反引号字符串作为命令执行,将单引号字符串作为文字字符串命令执行。另外,允许将Set中的文件名括在引号中。

我发现这仍然是关于C:\ Program无法执行的错误。

然后我记得,Windows cmd.exe有非常奇怪的引用规则,如果执行字符串中的第一个和最后一个字符是引号,它们将被剥离[2]。

所以我尝试了这个,它对我有用:

for /F usebackq %%d in (`""path to command" arg arg "quoted arg""`) do @echo %%d

[1] http://technet.microsoft.com/en-us/library/cc754900.aspx

[2] http://technet.microsoft.com/en-us/library/cc771320.aspx

答案 2 :(得分:0)

脱离Ben(https://stackoverflow.com/a/25084830/2630028)的回答,下面的示例对我有用:

for /f "usebackq delims=" %%j in (`^""C:\Perl64\bin\perl" -e "print(qq(foo))"^"`) do (
    echo LINE: %%j 
)

似乎我必须用^https://ss64.com/nt/syntax-esc.html)来转义外部引号。