if 语句中的 ERRORLEVEL 无法正常工作

ERRORLEVEL in if statement not works correctly

在此批处理文件中,ERRORLEVEL 正确显示(第一个选项 returns 1 和第二个 returns 2):

@echo off
choice /C YN /M "Yes or No"
echo The actual errorlevel is: %ERRORLEVEL%
pause
exit

但是当我尝试使用 if 语句时,发生了一些事情:

@echo off
choice /C YN /M "Yes or No"
if (%ERRORLEVEL% == 1) (echo You chose "Yes")
if (%ERRORLEVEL% == 2) (echo You chose "No")
pause
exit

这里没有显示消息...有帮助吗?我做错了什么吗?

删除括号:

if %ERRORLEVEL% == 1 echo You chose "Yes"
if %ERRORLEVEL% == 2 echo You chose "No"

说明

与 C、Javascript 或 Python 等语言不同,批处理脚本中的括号表示代码块,例如 {}

因此不需要也不应将它们放在 == 检查周围。如果您想要更复杂的表达式,您可能不得不将其拆分为多个 if 命令,如 in this article about if

所述

编辑:

As noticed by Stephan :

In this case the mistake is caused by command processor understanding ( and ) as a part of comparison strings, rather than as special characters, and so interpreting your statement as comparison between strings (%ERRORLEVEL% and 1) so string "(1" is compared to "1)" - they do not match so expression is false, but error is not generated since this is technically valid syntax (even though it does not do what you wanted)

You could write "%ERRORLEVEL%" == "1" to disambiguate your intentions, but really parenthesis should just not be used here

尽管围绕 echo 的括号应该适用于现代 Windows...

的这种特殊情况
  • 当只执行一个命令时它们不是必需的,在这种情况下通常在批处理脚本中被排除
  • 我建议将它们放在各自的行上(除了左括号需要与 iffor 在同一行)以确保它们不会被理解为一部分您正在执行的命令的语法:
if %ERRORLEVEL% == 1 (
    echo You chose "Yes"
)

Here 是对批处理脚本中括号的更详尽的解释。

关于 exit 的补充说明:

您不需要在脚本末尾 exit 除非您希望中止整个批处理执行。

如果一个批处理脚本是从另一个批处理脚本 call 编辑而来,或者在子例程中,这就是相关的。

如果您想结束 *.bat 文件或子例程的执行,请使用 goto :eof(注意冒号)- 这类似于在脚本的最后放置一个标签并跳转到它与 goto.

但是,exit /b 允许退出脚本并将 ERRORLEVEL 代码设置为指定值。这仅来自 运行 子例程或批处理脚本的 returns,并且不会像普通的 exit 那样终止 cmd.exe

可以找到有关 exit 的更多信息 here