批处理文件Errorlevel问题

Rah*_*kar 2 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%
Run Code Online (Sandbox Code Playgroud)

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

cmd退出/ b 0

将errorlevel重置为0但不起作用.

Joe*_*oey 6

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

setlocal enabledelayedexpansion
Run Code Online (Sandbox Code Playgroud)

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


azh*_*rei 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