我有批处理文件,其中包含调用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
我有批处理文件,其中包含调用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
正如帮助将告诉您的那样,COMMAND
应该是您要运行并获取输出的命令。所以在你的情况下second.bat
。至少它对我有用:
@echo off
FOR /F "tokens=*" %%F IN ('second.bat') do SET result=%%F
echo %result%
usebackq
请注意,如果您'
用于分隔命令,则不能使用该选项。
tl;博士
用两个命令的固定版本来补充Joey 的有用答案(它解决了您的第一个命令的问题):
:: '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
(通常需要调用批处理文件来继续执行调用的批处理文件),因为内部的任何命令(...)
都在子 cmd.exe
进程中运行。
使您的第二个命令起作用的唯一需要是删除之后的空格delims=
:
FOR /F "tokens=1 delims=" %%F IN ('second.bat') DO SET result=%%F
delims=
- 即,不指定分隔符(分隔符) -必须放在选项 string的最末尾,因为下一个字符总是被解释为分隔符,这就是您的情况发生的情况:空格成为分隔符。
此外,您可以通过删除来简化tokens=1
命令,因为根据定义delims=
,您只能获得 1 个标记(每行),即整个输入(行),原样:
FOR /F "delims=" %%F IN ('second.bat') DO SET result=%%F
最后,值得注意的是和之间存在细微差别tokens=*
delims=
:
delims=
(在选项字符串的最后)按原样返回输入/每个输入行。
tokens=*
从输入中去除前导分隔符实例;使用默认的分隔符集 - 制表符和空格 -前导空白被修剪。