我有一个批处理脚本“first.bat”,它返回一个值列表和一个退出代码。我的任务是在另一个脚本“second.bat”中调用此脚本,并且只有在调用第一个脚本没有返回错误代码时才对“first.bat”返回的值执行操作。
我调用了first.bat并将其输出存储在文本文件中。之后,如果结果代码是成功代码,我检查结果代码并通过读取文本文件来执行操作。操作后我删除了文本文件
以下是second.bat的代码片段
@ECHO OFF
call first.bat >t
if /i %errorlevel%==100 (
echo Performing operation
for /F "tokens=1" %%a in (t) do echo %%a
for /F "tokens=2" %%a in (t) do echo %%a
del t
) else (
echo Error occurred
)
我想知道可以通过不将first.bat的输出写入文本文件以一些优雅的方式完成同样的事情。
答案 0 :(得分:1)
@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
设置为errorlevel。
如果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
进行分析,以便做出决定。
这实际上取决于我们没有的信息。