我在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但不起作用。
答案 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