if-statement - 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 %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上的这种特殊情况下应该可以工作......
- 当只执行一个命令时它们不是必需的,并且通常在批处理脚本中被排除在这种情况下
- 我建议将它们放在自己的行中(除了左括号需要与
if
or位于同一行for
)以确保它们不会被理解为您正在执行的命令的语法的一部分:
if %ERRORLEVEL% == 1 (
echo You chose "Yes"
)
这是对批处理脚本中括号的更彻底的解释。
附加说明exit
:
exit
除非您希望中止整个批处理执行,否则您不需要在脚本末尾。
如果一个批处理脚本是call
从另一个批处理脚本或在子例程中编辑的,则这是相关的。
如果您想结束*.bat
文件或子程序的执行,请使用goto :eof
(注意冒号) - 这类似于在脚本的最后放置一个标签并使用goto
.
但是,exit /b
允许退出脚本并将ERRORLEVEL
代码设置为指定值。cmd.exe
这只会从运行的子程序或批处理脚本中返回,而不是像普通的那样终止exit
。
更多信息exit
可以在这里找到