2

我有批处理文件,其中包含调用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

4

2 回答 2

4

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

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

usebackq请注意,如果您'用于分隔命令,则不能使用该选项。

于 2012-10-04T14:12:49.210 回答
1

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=* 从输入中去除前导分隔符实例;使用默认的分隔符集 - 制表符和空格 -前导空白被修剪。

于 2017-11-18T22:36:39.007 回答