2013-04-23 65 views
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 
) 

我想知道能不能同样的事情在一些优雅的方式通过不写第一的输出来完成.bat文本文件。

+0

您可以为保留值设置一些环境变量。我没有看到很多选择。 – 2013-04-23 10:36:15

回答

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,那么生活变得在适当的点会设置bat1err以同样的方式有点复杂,

set bat1err=%errorlevel% 

,但你需要使用

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) 

,并再次可以用IF DEFINED分析,return2var作出决定。

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

+0

感谢您使用'ENDLOCAL&set bat1err =%bat1err%'技巧。 – 2014-04-29 00:23:31