[英]Batch script - usage of FOR /F with spaces in command and usebackq
相当新的批处理脚本。 我需要将命令的 output 分配给变量。 我开始了解 FOR /F 命令。 我的命令有空格和双引号。 所以我尝试使用 usebackq 选项。 但它因空间错误而失败。
for /F "usebackq delims=" %%G IN (`"C:\Program Files (x86)\ABC\DEF\XYZ.exe" Get /a "P1=D2" /b "Q1=D3" /c "D5"`) DO (
SET var=%%G
)
ECHO %var%
pause
失败:
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.
根据 StackOverflow 上的其他问题,我做的一切都是正确的 - usebackq用于使用反勾号, demlims=忽略空格作为分隔符。 我不确定为什么它仍然失败。 任何帮助表示赞赏!
由于程序名称后的参数周围有额外的引号,因此发布的行失败。 一种解决方法是将整个命令行嵌入到另一对外部引号中(并将保留字符(如()
转义为^(^)
,因为它们现在位于带引号的字符串之外)。
for /F "usebackq delims=" %%G IN (`""C:\Program Files ^(x86^)\ABC\DEF\XYZ.exe" Get /a "P1=D2" /b "Q1=D3" /c "D5""`) do (...)
如评论中所述,在这种情况下实际上不需要usebackq
,如果使用常规引号,则相同的语法将起作用。
此处无需使用反引号或usebackq
,只需使用单引号字符串和双引号即可。
@echo off
for /F "delims=" %%G IN ('"C:\Program Files (x86)\ABC\DEF\XYZ.exe" Get /a "P1=D2" /b "Q1=D3" /c "D5"') do set "var=%%G"
另请注意,不需要带括号的do
代码块来设置变量,事实上,据我所知,您甚至不需要变量,因为您只需使用元变量就可以逃脱。
@echo off
set "prog=C:\Program Files (x86)\ABC\DEF\XYZ.exe"
for /F "delims=" %%G IN ('"%prog%" Get /a "P1=D2" /b "Q1=D3" /c "D5"') do echo %%G
使用usebackq
在'
或`
中的命令行由FOR执行,带有选项/F
分别是 Windows 命令进程cmd.exe
在后台使用%ComSpec% /c
处理批处理文件,并将命令行附加为附加 ZDBC11CAA4BD5BDA9E7D7768888。
ComSpec
是使用%SystemRoot%\System32\cmd.exe
作为系统环境变量预定义的 Windows 环境变量。
帮助 output 运行cmd /?
在命令提示符中 window 解释了 Windows 命令处理器在选项/C
(执行命令行并关闭)或选项/K
(执行命令行并继续运行)之后如何解释字符串。
这里不需要使用反引号,因为要执行的命令行本身不包含一个或多个带有'
arguments 。 因此可以将命令行包含在'
中。
必须考虑FOR执行的命令行, Windows 命令解释器如何解析批处理脚本,即FOR命令行在cmd.exe
处理批处理文件后的样子调试批处理文件以及如何将命令行作为参数字符串传递给在后台执行的第二个cmd.exe
实例。
至少有以下两种解决方案。
for /F "delims=" %%G in ('^""%ProgramFiles(x86)%\ABC\DEF\XYZ.exe" Get /a "P1=D2" /b "Q1=D3" /c "D5"^"') do set "var=%%G"
for /F "delims=" %%G in ('""C:\Program Files (x86^)\ABC\DEF\XYZ.exe" Get /a "P1^=D2" /b "Q1^=D3" /c "D5""') do set "var=%%G"
第一个解决方案是Compo提出的,而且比较简单。 整个命令行包含在"
中,其中cmd.exe
在后台启动,在处理和执行剩余的命令行之前删除。在命令行开头和末尾额外添加的"
用^
转义,用于cmd.exe
处理批处理文件被解释为文字字符而不是参数字符串的开始/结束。 因此,两个转义的"
之间的参数字符串通常由处理FOR命令行的cmd.exe
解释。
第二种解决方案更难理解。 对于在后台启动的cmd.exe
,整个命令行也包含在"
中。但是对于处理批处理文件的cmd.exe
,双引号不会转义,因此,此cmd.exe
实例现在解释为以下命令行的列表。参数字符串:
""
C:\Program
Files
(x86
)
\ABC\DEF\XYZ.exe
" Get /a "
P1=D2
" /b "
Q1=D3
" /c "
D5
""
(x86
之后的右圆括号在这种情况下不会被解释为文字字符,因为它位于处理整个FOR命令行的cmd.exe
的双引号参数字符串之外。因此,它必须用^
转义才能被解释为文字字符而不是作为集合的结尾放置在错误的 position 之前'
标记要执行的命令行的结尾。
这两个等号都在处理批处理文件的cmd.exe
的双引号参数字符串之外。 因此cmd.exe
会将它们解释为参数分隔符,并将每个=
替换为空格字符。 这里不需要这样做,因为 arguments 应该作为P1=D2
和Q1=D3
传递给可执行文件,而不是作为P1 D2
和Q1 D3
。 因此,两个等号必须用^
转义才能解释为文字字符,而不是cmd.exe
处理批处理文件的参数分隔符。
两种解决方案都导致在后台运行 Windows 安装到C:\Windows
和 32 位程序文件到C:\Program Files (x86)
:
C:\Windows\System32\cmd.exe /c ""C:\Program Files (x86)\ABC\DEF\XYZ.exe" Get /a "P1=D2" /b "Q1=D3" /c "D5""
后台命令进程删除第一个和最后一个"
然后运行
"C:\Program Files (x86)\ABC\DEF\XYZ.exe" Get /a "P1=D2" /b "Q1=D3" /c "D5"
可以在目录C:\Program Files (x86)\ABC\DEF
中创建一个批处理文件XYZ.bat
,其中只包含命令行@echo %0 %*
并在包含FOR的批处理文件中将.exe
替换为.bat
命令行查看批处理文件是否完全执行以及将哪些参数传递给批处理文件。 这有助于了解在命令提示符 window 中删除@echo off
并使用FOR命令行运行批处理文件的情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.