【问题标题】:ERRORLEVEL in if statement not works correctly [closed]if语句中的ERRORLEVEL无法正常工作[关闭]
【发布时间】:2021-06-03 12:12:58
【问题描述】:

在这个批处理文件中,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 /? 并阅读帮助文本以找出正确的语法!
  • (1 永远不会等于 1)
  • 斯蒂芬,感谢您注意到这一点。如果您不介意,我将其添加到我的答案中,更详细地解释了这种情况

标签: if-statement batch-file cmd errorlevel


【解决方案1】:

去掉括号:

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

说明

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

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

编辑:

Stephan 注意到:

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

您可以写"%ERRORLEVEL%" == "1" 来消除您的意图, 但真正的括号不应该在这里使用

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

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

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

关于exit的补充说明:

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

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

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

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

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

【讨论】:

  • 谢谢哥们,我很感激
  • 不客气。基于 cmets,我在EDIT: 表示的部分中添加了更多细节
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 2015-09-27
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多