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

Retrieve command output to variable when command has spaces

我在各个地方都读到过我可以使用 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...。我无能为力绕过命令中的 space。

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

echo FooBar

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

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

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

每当您尝试直接从 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 命令中不需要空格来执行的文件的短名称。