将程序的输出分配给一个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