【发布时间】:2012-01-01 15:18:48
【问题描述】:
我必须在 for /f 循环中运行的程序有一个长路径名,其中包括右括号“)”,我需要从中解析输出:
for /f "tokens=1" %%G in ('"C:\Documents and Settings\myaccount\Desktop\Test_release (x86)\program.exe" list') do (echo Will do something with %%G)
...其中 'list' 是传递给我的程序的参数。我收到错误“'C:\Documents' 未被识别为内部或外部命令、可运行程序或批处理文件。”
我知道问题是右括号实际上关闭了“for”块,所以结尾的双引号没有“看到”,所以长路径名没有包含在 double引用了。我不明白的是为什么会发生这种情况,因为我的路径用双引号括起来?我还尝试了 usebackq 选项:
for /f "usebackq tokens=1" %%G in (`"C:\Documents and Settings\myaccount\Desktop\Test_release (x86)\program.exe" list`) do (echo Will do something with %%G)
...没有更好的结果。我试图像这样“^)”或像这样“^^)”那样逃跑,无事可做。尝试加倍双引号:
for /f "tokens=1" %%G in ('""C:\Documents and Settings\myaccount\Desktop\Test_release (x86)\program.exe"" list') do (echo Will do something with %%G)
还是不行。
此外,我实际上使用了一个保存路径的变量,该变量事先不知道(从 %CD% 构建),并且激活了 EnableDelayedExpansion。我尝试了延迟扩展(在其他情况下确实解决了类似问题)以防止变量在读取时扩展并在执行时延迟它:
setlocal EnableDelayedExpansion
set _var=%CD%\program.exe
@REM _var now contains C:\Documents and Settings\myaccount\Desktop\Test_release (x86)\program.exe
for /f "tokens=1" %%G in ('"!_var!" list') do (echo %%G)
endlocal
还是不行,不明白为什么。
但是,在上面的代码中加倍双引号并延迟扩展:
for /f "tokens=1" %%G in ('""!_var!"" list') do (echo %%G)
确实有效!...为什么...为什么必须这样做???它有什么作用?我不明白。我也担心它可能会在某些特定情况下导致问题...
有什么想法吗?
【问题讨论】:
-
对不起。你写道你试图逃避括号。你确定你是这样用的吗?:
for /f "tokens=1" %%G in ('"C:\Documents and Settings\myaccount\Desktop\Test_release ^(x86^)\program.exe" list') do (echo Will do something with %%G) -
是的,我按照我的第二个示例下面提到的那样尝试了它,但没有任何成功。
标签: batch-file for-loop cmd quotes