将程序的输出分配给一个variables

我需要使用MSbatch file将程序的输出分配给一个variables。

所以在GNU Bash shell中我会使用VAR=$(application arg0 arg1) 。 我需要在Windows中使用batch file类似的行为。

set VAR=application arg0 arg1

一种方法是:

 application arg0 arg1 > temp.txt set /p VAR=<temp.txt 

另一个是:

 for /f %%i in ('application arg0 arg1') do set VAR=%%i 

请注意, %%i中的第一个%用于在它之后转义% ,并且在batch file而不是命令行中使用上述代码时需要使用% 。 试想一下,你的test.bat有这样的东西:

 for /f %%i in ('c:\cygwin64\bin\date.exe +"%%Y%%m%%d%%H%%M%%S"') do set datetime=%%i echo %datetime% 

除了这个以前的答案之外 ,pipe道可以在for语句中使用,通过脱字符号转义:

  for /f "tokens=*" %%i in ('tasklist ^| grep "explorer"') do set VAR=%%i 

@OP,你可以使用for循环来捕获程序的返回状态,如果它输出的不是数字

假定您的应用程序的输出是一个数字返回代码,您可以执行以下操作

 application arg0 arg1 set VAR=%errorlevel% 

在执行: for /f %%i in ('application arg0 arg1') do set VAR=%%i得到错误:%%我在这个时候是意外的。 作为一个修复,我必须执行上面的for /f %i in ('application arg0 arg1') do set VAR=%i

除了答案,你不能直接在for循环的set部分中使用输出redirect操作符(例如,如果你想隐藏用户的stderror输出并提供更好的错误信息)。 相反,你必须用脱字符( ^ )来逃避它们:

 for /f %%O in ('some-erroring-command 2^> nul') do (echo %%O) 

参考: 在批处理脚本的循环中redirect命令的输出

 @echo off SETLOCAL ENABLEDELAYEDEXPANSION REM Prefer backtick usage for command output reading: REM ENABLEDELAYEDEXPANSION is required for actualized REM outer variables within for's scope; REM within for's scope, access to modified REM outer variable is done via !...! syntax. SET CHP=C:\Windows\System32\chcp.com FOR /F "usebackq tokens=1,2,3" %%i IN (`%CHP%`) DO ( IF "%%i" == "Aktive" IF "%%j" == "Codepage:" ( SET SELCP=%%k SET SELCP=!SELCP:~0,-1! ) ) echo actual codepage [%SELCP%] ENDLOCAL 
Interesting Posts