如何在批处理文件中将命令输出设置为变量


241

是否可以将批处理文件的语句输出设置为变量,例如:

findstr testing > %VARIABLE%

echo %VARIABLE%




另一个重复只是为了好玩:Windows将程序的输出批量分配给变量
icc97 '51

Answers:


274
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
SET var=%%F
)
ECHO %var%

我总是使用USEBACKQ,这样,如果您要插入一个字符串或一个长文件名,则可以使用双引号而不用拧紧命令。

现在,如果您的输出将包含多行,则可以执行此操作

SETLOCAL ENABLEDELAYEDEXPANSION
SET count=1
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
  SET var!count!=%%F
  SET /a count=!count!+1
)
ECHO %var1%
ECHO %var2%
ECHO %var3%
ENDLOCAL

3
在Win7系统上为我工作,谢谢!(是的,这是7年的实用性)PS不要忘记在命令中将%扩展到%%!
德米特里(Dmitry Ilukhin)

效果很好...除非输出中包含感叹号(!),否则在使用时将这些感叹号解释为控制字符ENABLEDELAYEDEXPANSION
JonathanDavidArndt,

它确实可以很好地工作,除非您需要|在这种情况下无法使用。
Matt Vukomanovic

5
@MattVukomanovic它使用的作品,我^|在的地方|,如所描述这里
AST

是否可以捕获退出代码command?我确定它会返回非零代码,但%ERRORLEVEL%无论我尝试在哪里使用它(即使在do块内),它始终包含0 。因此,我猜想该for构造的某些部分会覆盖它。顺便说一句,如此基本的东西需要多么疯狂的外观代码令人难以置信。
David FerenczyRogožan18年

67

我在Interweb那里发现了这个线程。归结为:

@echo off 
setlocal enableextensions 
for /f "tokens=*" %%a in ( 
'VER' 
) do ( 
set myvar=%%a 
) 
echo/%%myvar%%=%myvar% 
pause 
endlocal 

您还可以将命令的输出重定向到一个临时文件,然后将该临时文件的内容放入您的变量中,例如这样。它不适用于多行输入。

cmd > tmpFile 
set /p myvar= < tmpFile 
del tmpFile 

归功于Tom's Hardware上的线程。


3
底部方法(在所有其他方式中都更可取)的唯一缺点是,它不适用于多行输出。
dgo

对于VER,我会采取另一种方式:对于/ f“ tokens = 2 delims = [,]”('ver')中的%% a设置版本%% a echo%version%
Hardoman

1
您是likesuchashereby的第二个结果 -imagebin.ca/v/4NPSlQFgifce
Shmuel Kamensky

您的第二个示例在编写批处理文件以检查chromedriver.exe的版本与包含版本号的文本文件方面,对我有很大帮助。我是一个古老的DOS恐龙,并且不知道对set命令的切换。其他东西对我来说太过分了。
比尔·希勒曼

47

在一行中:

FOR /F "tokens=*" %g IN ('*your command*') do (SET VAR=%g)

命令输出将在%g中设置,然后在VAR中设置。

详细信息:https : //ss64.com/nt/for_cmd.html


19
我的批处理未使用“%g”运行。它与“ %% g”一起运行。
Santiago Villafuerte

5
+ Santiago Villafuerte:是的,如果您正在从批处理文件运行,但是如果要自己从命令行运行(例如:在将其放入批处理文件之前进行测试),则可以使用单个%。
布伦特·里滕豪斯

19

要读取文件...

set /P Variable=<File.txt

写入文件

@echo %DataToWrite%>File.txt

注意; 在<>字符前有空格会导致在变量末尾添加空格,

要添加到文件(如记录器程序),请首先在其中创建一个文件,并使用单个回车键e.txt

set /P Data=<log0.log
set /P Ekey=<e.txt
@echo %Data%%Ekey%%NewData%>log0.txt

您的日志将如下所示

Entry1
Entry2 

等等

无论如何,有一些有用的东西


谢谢您的回答。BTW“ set / P Variable = <File.txt”仅读取文件的第一行
Deepscorn

18

这些答案都非常接近我需要的答案。这是对它们进行扩展的尝试。

在批处理文件中

如果您是从.bat文件中运行的,并且希望使用一行来将复杂的命令导出jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json到名为的变量,AWS_ACCESS_KEY那么您需要这样做:

FOR /F "tokens=* USEBACKQ" %%g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%%g")

在命令行上

如果在C:\提示符处,您需要一行以允许您运行复杂的命令,例如jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json对名为的变量的操作,AWS_ACCESS_KEY那么您需要这样做:

FOR /F "tokens=* USEBACKQ" %g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%g")

说明

上面两个答案之间的唯一区别是,在命令行上,您在变量中使用了一个%。在批处理文件中,您必须加倍百分号(%%)。

由于该命令包含冒号,引号和括号,因此您需要USEBACKQ在选项中包括该行,以便可以使用反引号指定要运行的命令,然后在其中使用各种有趣的字符。


12

如果您不想输出到临时文件然后读入变量,则此代码将命令结果直接存储到变量中:

FOR /F %i IN ('findstr testing') DO set VARIABLE=%i
echo %VARIABLE%

如果要将搜索字符串用双引号引起来:

FOR /F %i IN ('findstr "testing"') DO set VARIABLE=%i

如果要将此代码存储在批处理文件中,请添加一个额外的%符号:

FOR /F %%i IN ('findstr "testing"') DO set VARIABLE=%%i

一个有用的示例,用于计算目录中文件的数量并存储在变量中:(说明管道)

FOR /F %i IN ('dir /b /a-d "%cd%" ^| find /v /c "?"') DO set /a count=%i

注意使用单引号,而不是在命令括号双引号“或重音符'的,这是更清洁的替代delimstokensusebackqfor循环。

在Win 10 CMD上测试。


1
cd %windir%\system32\inetsrv

@echo off

for /F "tokens=* USEBACKQ" %%x in (      
        `appcmd list apppool /text:name`
       ) do (
            echo|set /p=  "%%x - " /text:name & appcmd.exe list apppool "%%x" /text:processModel.identityType
       )

echo %date% & echo %time%

pause

我看不到如何解决这个问题。appcmd不是标准程序,我看不到将程序输出分配给变量的位置。最后,你需要一些更多的解释
杰布

-3

我已经像这样测试过,并且有效:

SET /P Var= | Cmd

通过将命令传递到变量中,提示符将命令“ Cmd” 的结果插入变量“ Var”中。

更新:

它不起作用,不好的是,我做的脚本是这样的:

SET /P Var= | dir /b *.txt
echo %Var%

它实际上显示的是“ test.txt”,但实际上显示的是“ dir /b *.txt”命令的结果,而不是echo %var%。由于两个输出相同,我感到困惑。


3
如果您打算这样做,pipe the command into a variable prompt则应该编写它dir /b *.txt | SET /P Var=以使管道方向正确。PS:那也不行!
杰西·奇斯霍尔姆

-18

希望有帮助

set a=%username%
echo %a%    
set a="hello"
echo %a%

5
不,这不能回答问题。问题是将命令的输出转换为变量
jeb 2015年

最简单的方法是写入文件并从该文件中读取文件。findstr“ test” test.txt> testoutput.txt设置/pa=<testoutput.txt回显%a%
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.