【问题标题】:Call one batch script in another batch script and perform operation on the values returned by first script在另一个批处理脚本中调用一个批处理脚本并对第一个脚本返回的值执行操作
【发布时间】:2013-04-16 08:00:57
【问题描述】:

我有一个批处理脚本“first.bat”,它返回一个值列表和一个退出代码。我的任务是在另一个脚本“second.bat”中调用这个脚本,并且只有在调用第一个脚本没有返回错误码的情况下,才对“first.bat”返回的值执行操作。

我调用了 first.bat 并将其输出存储在一个文本文件中。之后,我检查结果代码,如果结果代码是成功代码,则通过读取文本文件来执行操作。操作后我删除了文本文件

下面是second.bat的代码sn-p

@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 的输出写入文本文件以某种优雅的方式完成相同的事情。

【问题讨论】:

  • 您可以设置一些环境变量来保留值。我没有看到很多替代方案。

标签: batch-file


【解决方案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 设置为您的两个值,但无法检索由 FIRST.bat 生成的 ERRORLEVEL 的值。

在您的原始代码中,无论如何都会生成文件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) 

同样returnreturn2var 可以通过IF DEFINED 进行分析以做出决策。

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

【讨论】:

    最近更新 更多