2

我在 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 并根据它返回的错误级别,我正在调用另一个 exe,并且再次根据该 exe 的错误级别,我正在调用第三个 exe。问题是,我得到的退出代码是分配的第一个退出代码,即如果 test.jar 存在 2 即使在其他 exe 成功执行后错误级别没有改变。第三个exe永远不会被执行。尝试了不同的调用方法

命令退出 /b 0

用于将错误级别重置为 0 但它不起作用。

4

2 回答 2

7

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

setlocal enabledelayedexpansion

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

于 2012-07-19T05:19:28.200 回答
5

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

使用!错误级别!和/或 !EXITCODE! 延迟扩展,以便这些变量稍后会扩展,并具有最新的值。

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

例如

@echo 关闭
setlocal enabledelayedexpansion
设置 FOO=foo
回声%FOO%
如果 1==1 (
   设置 FOO=bar
   回声%FOO%
   回声!FOO!
)

产生:

富
富
酒吧
于 2012-07-19T05:23:29.270 回答