@ECHO OFF
SETLOCAL
for %%i in (var return1 return2 bat1err) do set "%%i="
FOR /f %%i IN ('call first') DO SET var=%%i
FOR /f "tokens=1,2" %%i IN ("%var%") DO set return1=%%i&set return2=%%j
应该将 return1 和 return2 设置为您的两个值,但ERRORLEVEL
生成的值FIRST.bat
无法检索。
在您的原始代码中,t
无论如何都会生成该文件 - 如果没有来自first.bat
. 我对你的行为感到困惑,只有t
在没有错误发生的情况下才删除......
所以——我们真正需要做的是改变FIRST.bat
一点。
如果first.bat
不使用 SETLOCAL,则
set bat1err=%errorlevel%
在适当的时候将返回bat1err
设置为错误级别。
如果first.bat
确实使用 SETLOCAL,那么生活会变得更复杂一些
set bat1err=%errorlevel%
在适当的点将以bat1err
相同的方式设置,但您需要使用
ENDLOCAL&set bat1err=%bat1err%
在退出之前。这是一个解析技巧,在首先解析行,然后执行的方式上兑现。发生的事情是该行实际上被执行为
endlocal&set bat1err=22
或者其他什么,BAT1ERR
在调用的上下文中设置,而不是被调用的批处理。
另一种方法是包含%errorlevel%
在您的输出中,并将分析更改为
FOR /f "tokens=1,2,3" %%i IN ("%var%") DO set bat1err=%%i&return1=%%j&set return2=%%k
或者,取决于输出的first.bat
内容,您可以通过第三种方式进行操作:
如果first.bat
没有输出错误但输出一行成功,
FOR /f %%i IN ('call first') DO SET var=%%i
if defined var (
FOR /f "tokens=1,2" %%i IN ("%var%") DO set return1=%%i&set return2=%%j
) else (echo Error occurred)
再一次return
,return2
并且var
可以进行分析IF DEFINED
以做出决策。
这真的取决于我们没有的信息。