当命令有空格时,将命令输出检索到变量

时间:2015-10-27 14:39:52

标签: windows variables batch-file command

我已经在各个地方读过我可以使用Windows批处理文件for来获取命令的输出并将其放入变量中,如下所示:

FOR /F %%G IN ('foo-command') DO SET FOO=%%G

大。因此我的foo-command实际上是C:\Program Files\Foo\foo.bat,并且存储在FOO_BAT变量中。它需要一个参数bar,其值为blah blah='foobar' blah。所以我试试看:

FOR /F %%G IN ('%FOO_BAT% -bar "blah blah='foobar' blah"') DO SET FOO=%%G

我得到了一个可爱的'C:\Program' is not recognized...。我无能为力,可以绕过命令中的空间。

如果要重现此内容,请创建一个仅包含以下内容的简单C:\Program Files\Foo\foo.bat文件,然后在批处理文件中运行上面的行。

echo FooBar

如果命令的路径中有空格,我如何捕获命令的输出(带参数)作为Windows批处理变量?

  • 是的,我已尝试在%FOO_EXE%附近加上引号。
  • 是的,我已经尝试将所有内容放在一个单独的变量中并在FOR中使用该单个变量。
  • 在告诉我它有效之前,请使用我提供的参数尝试此。参数的存在会改变一切。

2 个答案:

答案 0 :(得分:4)

每当您尝试直接从FOR循环处理输出时,我建议您添加usebackq参数。这允许您在命令中包含引号(通常需要)以指定完整文件路径或在其中包含空格的单个参数。

例如:

REM Using the DIR command with FOR switches, extract the short name.
REM The path specified below can be fed by a variable.
FOR /F "usebackq tokens=*" %%G IN (`DIR "C:\Program Files\Foo\foo-command.exe" /B /S`) DO SET FooPathShortName=%%~sG
ECHO Short Name is: %FooPathShortName%

REM No quotes are needed to run the short name.
FOR /F "usebackq" %%G IN (`%FooPathShortName% -bar "blah blah='foobar' blah"`) DO SET Foo=%%G

在上面,我使用DIR命令将目标可执行文件的完整路径输出为FOR函数可以解析为文件的格式。由此我确定了文件的短名称,该名称不需要在第二个FOR命令中执行空格。

答案 1 :(得分:2)

FOR /F "delims=" %%G IN ('CALL "C:\path with spaces\foo.bat" "blah blah='foobar' blah"') do set foo=%%G

试一试。是的,我测试了它。 Foo.bat除了回显%1之外什么都不做。