我有批处理文件,其中包含调用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
答案 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=
从输入中删除前导分隔符实例;使用默认的分隔符集 - 制表符和空格 - 前导空格被裁剪。