繁体   English   中英

批处理脚本 - FOR /F 在命令和 usebackq 中使用空格

[英]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实例现在解释为以下命令行的列表。参数字符串:

  1. ""
  2. C:\Program
  3. Files
  4. (x86
  5. )
  6. \ABC\DEF\XYZ.exe
  7. " Get /a "
  8. P1=D2
  9. " /b "
  10. Q1=D3
  11. " /c "
  12. D5
  13. ""

(x86之后的右圆括号在这种情况下不会被解释为文字字符,因为它位于处理整个FOR命令行的cmd.exe的双引号参数字符串之外。因此,它必须用^转义才能被解释为文字字符而不是作为集合的结尾放置在错误的 position 之前'标记要执行的命令行的结尾。

这两个等号都在处理批处理文件的cmd.exe的双引号参数字符串之外。 因此cmd.exe会将它们解释为参数分隔符,并将每个=替换为空格字符。 这里不需要这样做,因为 arguments 应该作为P1=D2Q1=D3传递给可执行文件,而不是作为P1 D2Q1 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM