当命令有空格时将命令输出检索到变量
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 批处理变量?
- 是的,我试过在
%FOO_EXE%
周围加上引号。
- 是的,我试过将所有内容放在一个单独的变量中并在
FOR
. 中使用该单个变量
- 请先使用我提供的参数试一下,然后再告诉我它有效。参数的存在改变了一切。
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
命令中不需要空格来执行的文件的短名称。
我在各个地方都读到过我可以使用 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 批处理变量?
- 是的,我试过在
%FOO_EXE%
周围加上引号。 - 是的,我试过将所有内容放在一个单独的变量中并在
FOR
. 中使用该单个变量
- 请先使用我提供的参数试一下,然后再告诉我它有效。参数的存在改变了一切。
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
命令中不需要空格来执行的文件的短名称。