批处理文件Errorlevel问题

时间:2012-07-19 05:14:49

标签: java batch-file

我在Windows 7 Enterprise上并从批处理文件调用jar,根据条件返回0,1或2,我使用了“System.exit”,

以下是我的批处理脚本

@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%

我在上面的代码中做的是,调用一个jar并依赖于errorlevel它返回我调用另一个exe并再次取决于该exe的错误级别我调用第三个exe。问题是,我得到的exitcode是第一个退出代码分配,即如果test.jar存在,即使在成功执行其他exes之后,errorlevel也不会被更改。第三个exe永远不会被执行。尝试了不同的方法来调用

  

cmd exit / b 0

用于将errorlevel重置为0但不起作用。

2 个答案:

答案 0 :(得分:6)

您的问题是cmd在语句解析时立即扩展环境变量,而不是在执行时。在这个意义上的陈述包括整个if包括块。您需要使用延迟扩展,因此请在批处理开始时粘贴以下内容:

setlocal enabledelayedexpansion

然后在条件语句中使用!errorlevel!而不是%errorlevel%(同样适用于exitcode)。

答案 1 :(得分: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