If statement if语句中的ERRORLEVEL不能正常工作
在此批处理文件中,ERRORLEVEL正确显示(第一个选项返回1,第二个选项返回2): 但是当我尝试使用If statement if语句中的ERRORLEVEL不能正常工作,if-statement,batch-file,cmd,errorlevel,If Statement,Batch File,Cmd,Errorlevel,在此批处理文件中,ERRORLEVEL正确显示(第一个选项返回1,第二个选项返回2): 但是当我尝试使用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
语句时,发生了一些事情:
@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
命令,如所述
编辑:
斯蒂芬注意到:
在这种情况下,错误是由命令处理器引起的
将(
和)
理解为比较字符串的一部分,
而不是作为特殊的角色,所以解释
将语句作为字符串(%ERRORLEVEL%
和1)
所以字符串“(1
”与“1)
”进行比较-它们不匹配
所以表达式为false,但不会生成错误,因为这是
技术上有效的语法(即使它不符合您的要求)
您可以编写%ERRORLEVEL%=“1”
来消除您的意图的歧义,
但实际上这里不应该使用括号
尽管在现代Windows上,echo
周围的括号应该适用于这种特殊情况
- 当只执行一个命令时,它们不是必需的,通常在批处理脚本中排除在外
- 我建议将它们放在它们自己的行中(除非左括号需要与
或if
在同一行中),以确保它们不被理解为您正在执行的命令语法的一部分:for
*.bat
文件或子例程的执行,请使用goto:eof
(注意冒号)-这类似于将标签放在脚本的最末端,然后使用goto
跳转到它
但是,exit/b
允许退出脚本并将ERRORLEVEL
code设置为指定值。这仅从运行子例程或批处理脚本返回,而不会像普通的退出那样终止cmd.exe
有关退出的更多信息,请参见删除括号:
if %ERRORLEVEL% == 1 echo You chose "Yes"
if %ERRORLEVEL% == 2 echo You chose "No"
解释
与C、Javascript或Python等语言不同,批处理脚本中的括号表示{
和}
因此,不需要也不应该使用它们进行检查。如果您想要更复杂的表达式,您可能需要将其拆分为几个If
命令,如所述
编辑:
斯蒂芬注意到:
在这种情况下,错误是由命令处理器引起的
将(
和)
理解为比较字符串的一部分,
而不是作为特殊的角色,所以解释
将语句作为字符串(%ERRORLEVEL%
和1)
所以字符串“(1
”与“1)
”进行比较-它们不匹配
所以表达式为false,但不会生成错误,因为这是
技术上有效的语法(即使它不符合您的要求)
您可以编写%ERRORLEVEL%=“1”
来消除您的意图的歧义,
但实际上这里不应该使用括号
尽管在现代Windows上,echo
周围的括号应该适用于这种特殊情况
- 当只执行一个命令时,它们不是必需的,通常在批处理脚本中排除在外
- 我建议将它们放在它们自己的行中(除非左括号需要与
或if
在同一行中),以确保它们不被理解为您正在执行的命令语法的一部分:for
*.bat
文件或子例程的执行,请使用goto:eof
(注意冒号)-这类似于将标签放在脚本的最末端,然后使用goto
跳转到它
但是,exit/b
允许退出脚本并将ERRORLEVEL
code设置为指定值。这仅从运行子例程或批处理脚本返回,而不会像普通的退出那样终止cmd.exe
可以找到有关退出的更多信息在命令提示窗口中键入
if/?
,并阅读帮助文本以找出正确的语法<代码>(1永远不会等于1)
Stephan,感谢您注意到这一点。如果您不介意的话,我在回答中添加了这一点,更详细地解释了情况。在命令提示窗口中键入If/?
,然后阅读帮助文本以找出正确的语法<代码>(1永远不会等于1)
Stephan,感谢您注意到这一点。如果你不介意的话,我在我的回答中加了一句,更详细地解释了情况。谢谢你,伙计,我很感激你不客气。基于这些评论,我在下面的一节中添加了更多的细节
if %ERRORLEVEL% == 1 (
echo You chose "Yes"
)