如何将批处理(CALL)命令的输出存储到变量

时间:2012-10-04 14:09:12

标签: shell batch-file command command-prompt

我有批处理文件,其中包含调用second.bat文件的命令。调用时会产生单行输出。我想将该行存储到变量中。

CALL second.bat

我尝试过使用以下几行命令,但没有使用

FOR /F "tokens=* USEBACKQ" %%F IN ('COMMAND') do SET result=%%F
FOR /F "tokens=1 delims= " %%A IN ('COMMAND') DO SET NumDocs=%%A

我不知道要用COMMAND

替换什么

2 个答案:

答案 0 :(得分:4)

正如帮助会告诉你的那样,COMMAND应该是你想要运行的命令并获得输出。所以在你的情况下second.bat。至少它对我有用:

@echo off
FOR /F "tokens=*" %%F IN ('second.bat') do SET result=%%F
echo %result%

请注意,如果您使用usebackq来分隔命令,则无法使用'选项。

答案 1 :(得分:1)

<强> TL;博士

使用固定版本的命令来补充Joey's helpful answer(使用 1st 命令修复问题):

::  'usebackq' requires enclosing the command in `...` (back quotes aka backticks)
FOR /F "tokens=* usebackq" %%F IN (`second.bat`) do SET result=%%F

:: No characters must follow "delims="; 'tokens=1' is redundant
FOR /F "delims="           %%F IN ('second.bat') DO SET result=%%F

请注意,在这种情况下,为了调用call(您通常需要继续执行调用批处理文件),不需要second.bat,因为{{1}中的任何命令在 (...)进程中运行。

使 2nd 命令工作所需的唯一方法是删除cmd.exe 之后的空格:

delims=

FOR /F "tokens=1 delims=" %%F IN ('second.bat') DO SET result=%%F - 即,指定分隔符(分隔符) - 必须放在的最后选项字符串,因为下一个字符总是被解释为分隔符,这就是你的情况: space 成为分隔符。

此外,您可以通过删除delims=简化该命令,因为 tokens=1按照定义只能获得1个令牌(每行),即整个输入(行),原样:

delims=

最后,值得注意的是FOR /F "delims=" %%F IN ('second.bat') DO SET result=%%F tokens=* 之间存在细微差别:

  • delims=(在选项字符串的最后)返回输入/每个输入行 as

  • delims= 从输入中删除前导分隔符实例;使用默认的分隔符集 - 制表符和空格 - 前导空格被裁剪。