1

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

4

1 回答 1

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设置为错误级别。

如果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) 

再一次returnreturn2并且var可以进行分析IF DEFINED以做出决策。

这真的取决于我们没有的信息。

于 2013-04-23T11:15:43.607 回答