嵌套if语句中.bat文件%errorlevel%值错误

4

我写了一个 .bat 文件,首先运行一个程序,如果它成功完成,然后运行另一个程序并检查它的返回值。

first-program.exe
IF "%ERRORLEVEL%"=="0" (
    second-program.exe
    IF "%ERRORLEVEL%"=="0" (
        ECHO OK
    ) ELSE (
        ECHO NOK
    )
)

然而,第二个 %ERRORLEVEL% 总是等于第一个,它不会设置为 second-program.exe 的返回值。

1
你尝试过使用延迟扩展吗? - Compo
2
你需要使用延迟扩展来获取second-program.exe后的ErrorLevel,因为它在同一代码块中被更新了。 - aschipfl
4
可能是[ERRORLEVEL vs %ERRORLEVEL% vs 感叹号ERRORLEVEL感叹号]的重复问题。 - aschipfl
2
根据不同的“程序”,您可能只需执行以下操作:"First-Program.exe" && ( "Second-Program.exe" && ( Echo OK ) || Echo NOK ) - Compo
1个回答

5

%ERRORLEVEL%的两个实例位于同一代码块中,因此在第一个实例更新时,两个实例都会获得它们的值。考虑启用变量的延迟扩展,使用enabledelayedexpansion%ERRORLEVEL%替换为!ERRORLEVEL!以单独更新每个实例。例如:

@echo off
setlocal enabledelayedexpansion
first-program.exe
IF "!ERRORLEVEL!"=="0" (
    second-program.exe
    IF "!ERRORLEVEL!"=="0" (
        ECHO OK
    ) ELSE (
        ECHO NOK
    )
)
endlocal

我的脚本中只有一个%ERRORLEVEL%实例,但它错误地返回了0。我将其更改为!ERRORLEVEL!,现在我的脚本似乎可以正常工作了。虽然我仍然不确定原因所在。enabledelayedexpansion设置此时对我来说还是相当模糊的。 - velkoon
1
@velcoon,没有看到你的代码,所以无法确定答案,但我猜测可能的原因是你在IF或FOR循环中使用了%ERRORLEVEL%。为了保险起见,在循环内部最好始终使用延迟扩展。 - hoonose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接