if 语句中的 ERRORLEVEL 无法正常工作
ERRORLEVEL in if statement not works correctly
在此批处理文件中,ERRORLEVEL 正确显示(第一个选项 returns 1 和第二个 returns 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
命令,如 in this article about if
所述
编辑:
As noticed by Stephan :
In this case the mistake is caused by command processor
understanding (
and )
as a part of comparison strings,
rather than as special characters, and so interpreting
your statement as comparison between strings (%ERRORLEVEL%
and 1)
so string "(1
" is compared to "1)
" - they do not match
so expression is false, but error is not generated since this is
technically valid syntax (even though it does not do what you wanted)
You could write "%ERRORLEVEL%" == "1"
to disambiguate your intentions,
but really parenthesis should just not be used here
尽管围绕 echo
的括号应该适用于现代 Windows...
的这种特殊情况
- 当只执行一个命令时它们不是必需的,在这种情况下通常在批处理脚本中被排除
- 我建议将它们放在各自的行上(除了左括号需要与
if
或 for
在同一行)以确保它们不会被理解为一部分您正在执行的命令的语法:
if %ERRORLEVEL% == 1 (
echo You chose "Yes"
)
Here 是对批处理脚本中括号的更详尽的解释。
关于 exit
的补充说明:
您不需要在脚本末尾 exit
除非您希望中止整个批处理执行。
如果一个批处理脚本是从另一个批处理脚本 call
编辑而来,或者在子例程中,这就是相关的。
如果您想结束 *.bat
文件或子例程的执行,请使用 goto :eof
(注意冒号)- 这类似于在脚本的最后放置一个标签并跳转到它与 goto
.
但是,exit /b
允许退出脚本并将 ERRORLEVEL
代码设置为指定值。这仅来自 运行 子例程或批处理脚本的 returns,并且不会像普通的 exit
那样终止 cmd.exe
。
可以找到有关 exit
的更多信息 here
在此批处理文件中,ERRORLEVEL 正确显示(第一个选项 returns 1 和第二个 returns 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
命令,如 in this article about if
编辑:
As noticed by Stephan :
In this case the mistake is caused by command processor understanding
(
and)
as a part of comparison strings, rather than as special characters, and so interpreting your statement as comparison between strings(%ERRORLEVEL%
and1)
so string "(1
" is compared to "1)
" - they do not match so expression is false, but error is not generated since this is technically valid syntax (even though it does not do what you wanted)You could write
"%ERRORLEVEL%" == "1"
to disambiguate your intentions, but really parenthesis should just not be used here
尽管围绕 echo
的括号应该适用于现代 Windows...
- 当只执行一个命令时它们不是必需的,在这种情况下通常在批处理脚本中被排除
- 我建议将它们放在各自的行上(除了左括号需要与
if
或for
在同一行)以确保它们不会被理解为一部分您正在执行的命令的语法:
if %ERRORLEVEL% == 1 (
echo You chose "Yes"
)
Here 是对批处理脚本中括号的更详尽的解释。
关于 exit
的补充说明:
您不需要在脚本末尾 exit
除非您希望中止整个批处理执行。
如果一个批处理脚本是从另一个批处理脚本 call
编辑而来,或者在子例程中,这就是相关的。
如果您想结束 *.bat
文件或子例程的执行,请使用 goto :eof
(注意冒号)- 这类似于在脚本的最后放置一个标签并跳转到它与 goto
.
但是,exit /b
允许退出脚本并将 ERRORLEVEL
代码设置为指定值。这仅来自 运行 子例程或批处理脚本的 returns,并且不会像普通的 exit
那样终止 cmd.exe
。
可以找到有关 exit
的更多信息 here