首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >if语句中的ERRORLEVEL不能正确工作

if语句中的ERRORLEVEL不能正确工作
EN

Stack Overflow用户
提问于 2021-03-04 19:43:10
回答 1查看 780关注 0票数 0

在这个批处理文件中,正确地显示了ERRORLEVEL (第一个选项返回1,第二个选项返回2):

代码语言:javascript
复制
@echo off
choice /C YN /M "Yes or No"
echo The actual errorlevel is: %ERRORLEVEL%
pause
exit

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

代码语言:javascript
复制
@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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-04 20:51:01

删除括号:

代码语言:javascript
复制
if %ERRORLEVEL% == 1 echo You chose "Yes"
if %ERRORLEVEL% == 2 echo You chose "No"

解释

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

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

编辑:

正如Stephan所注意到的: 在这种情况下,错误的原因是命令处理程序将()理解为比较字符串的一部分,而不是特殊字符,因此将语句解释为字符串(%ERRORLEVEL%1)之间的比较--因此字符串"(1“与"1)”不匹配,因此表达式是假的,但错误不会生成,因为这在技术上是有效的语法(尽管它不能满足您的需要)。 您可以编写"%ERRORLEVEL%" == "1"来消除您的意图的歧义,但实际上这里不应该使用括号。

虽然echo周围的括号在现代Windows上应该适用于这种特殊情况.

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

这里是对批处理脚本中括号的更全面的解释。

关于exit的附加说明

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

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

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66481955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档