我在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但不起作用.
您的问题是cmd
在解析语句时立即扩展环境变量,而不是在执行时.在这个意义上的陈述包括整体,if
包括块.您需要使用延迟扩展,因此请在批处理开始时粘贴以下内容:
setlocal enabledelayedexpansion
Run Code Online (Sandbox Code Playgroud)
然后使用!errorlevel!
而不是%errorlevel%
在条件语句中(同样为exitcode
).
当您的第一个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