2012-07-19 106 views
2

我在Windows 7企业版,并呼吁从0,1或2取决于条件,返回批处理文件罐子,我曾用“System.exit”为同一,批处理文件ERRORLEVEL问题

下面是我的批处理脚本

@echo off 

java -jar "test.jar" %* 
set exitcode=%ERRORLEVEL% 
echo here is 1st exit code %exitcode% 
if %exitcode% == 2 ( 
     VERIFY > nul 
     set exitcode=%ERRORLEVEL% 
     echo here is 2nd exit code after VERIFY %exitcode% 
     call test.exe %* 
     echo here is 2nd exit code %ERRORLEVEL% 

    if %ERRORLEVEL% == 0 (
      cmd /c "exit /b 0" 
      call test1.exe -f 
      echo here is 3rd exit code %errorlevel% 
    ) 
)exit /b %errorlevel% 

我在上面的代码做的是什么,调用一个罐子,根据ERRORLEVEL返回我打电话另一个exe文件,并再次取决于EXE我打电话第三exe文件的错误级别。问题是,我得到的exitcode是第一个退出代码,即使test.jar与2一起存在,即使成功执行其他exes errorlevel后也不会更改。而第三个exe永远不会被执行。尝试不同的方法调用

CMD退出/ B 0

重置错误级别为0,但它不工作的。

回答

6

你的问题是,cmd当语句是解析立即展开环境变量,而不是当它被执行。在这个意义上的声明包括整个if包括块。你需要使用延迟扩展,所以坚持在批处理开始执行以下操作:

​​

然后用!errorlevel!代替%errorlevel%的条件语句中(同样为exitcode)。

+0

随机downvoter:为什么呢? – Joey 2012-07-20 08:16:12

5

当您的第一个IF语句到达时,所有出现的%ERRORLEVEL%将被替换为当前所有(与第一个退出代码相同)。

使用!ERRORLEVEL!和/或!EXITCODE!得到延迟扩展,以便这些变量稍后得到扩展,并保持最新值。

这需要您在脚本的顶部添加setlocal enabledelayedexpansion

 
@echo off 
setlocal enabledelayedexpansion 
set FOO=foo 
echo %FOO% 
if 1==1 (
    set FOO=bar 
    echo %FOO% 
    echo !FOO! 
) 

产地:

 
foo 
foo 
bar