if语句中的ERRORLEVEL无法正常工作[关闭]

Posted

技术标签:

【中文标题】if语句中的ERRORLEVEL无法正常工作[关闭]【英文标题】:ERRORLEVEL in if statement not works correctly [closed] 【发布时间】: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) 斯蒂芬,感谢您注意到这一点。如果您不介意,我将其添加到我的答案中,更详细地解释了这种情况 【参考方案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: 表示的部分中添加了更多细节

以上是关于if语句中的ERRORLEVEL无法正常工作[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

is_null 函数在我的 if 语句中无法正常工作

shmget shmat 无法正常工作 [关闭]

ReactJS 中的电子邮件验证无法正常工作 [重复]

bat脚本获取 exe返回值 ErrorLevel 的参数和设定

数组中的二进制搜索无法正常工作[关闭]

动画列表中的颤振关闭项目无法正常工作