首页 > 解决方案 > if 语句中的 ERRORLEVEL 无法正常工作

问题描述

在此批处理文件中,ERRORLEVEL正确显示(第一个选项返回 1,第二个选项返回 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-statementbatch-filecmderrorlevel

解决方案


删除括号:

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

解释

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

因此,==不需要也不应该使用将它们放在支票周围。如果您想要更复杂的表达式,则可能不得不将其拆分为本文if中概述的几个命令if

编辑:

正如斯蒂芬所注意到的:

在这种情况下,错误是由命令处理器理解引起的,(并且)是比较字符串的一部分,而不是特殊字符,因此将您的语句解释为字符串之间的比较(%ERRORLEVEL%1) 因此字符串“ (1”与“”进行比较1)- 它们不匹配所以表达式为假,但不会产生错误,因为这在技术上是有效的语法(即使它不符合您的要求)

你可以写信"%ERRORLEVEL%" == "1"来消除你的意图,但实际上括号不应该在这里使用

尽管括号echo在现代Windows上的这种特殊情况下应该可以工作......

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

是对批处理脚本中括号的更彻底的解释。

附加说明exit

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

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

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

但是,exit /b允许退出脚本并将ERRORLEVEL代码设置为指定值。cmd.exe这只会从运行的子程序或批处理脚本中返回,而不是像普通的那样终止exit

更多信息exit可以在这里找到


推荐阅读