在另一个批处理脚本中调用一个批处理脚本,并对第一个脚本返回的值执行操作

时间:2013-04-23 07:42:36

标签: batch-file

我有一个批处理脚本“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的输出写入文本文件以一些优雅的方式完成同样的事情。

1 个答案:

答案 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) 

再次returnreturn2var可以IF DEFINED进行分析,以便做出决定。

这实际上取决于我们没有的信息。