在这个批处理文件中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
的概述。编辑:
正如Stephan注意到的:
在这种情况下,错误是由命令处理程序引起的将
(
和)
理解为比较字符串的一部分,而不是作为特殊字符来解释你的语句作为字符串(%ERRORLEVEL%
和1)
之间的比较所以string "(1
";与"1)
";-它们不匹配所以表达式是假的,但是没有产生错误,因为这是技术上有效的语法(即使它没有做你想要的)你可以写
"%ERRORLEVEL%" == "1"
来消除你的意图,但是这里不应该使用括号
尽管echo
周围的括号在现代Windows上应该可以在这种特殊情况下工作…
- 当只执行一个命令时,它们是不必要的,并且在批处理脚本中通常在这种情况下被排除
- 我建议把它们放在自己的行上(除了左括号需要与
if
或for
在同一行),以确保它们不被理解为您正在执行的命令语法的一部分:
if %ERRORLEVEL% == 1 (
echo You chose "Yes"
)
这里是批处理脚本中括号的更详细的解释。
exit
的附加说明:
你不需要在脚本的末尾加上exit
,除非你想要整个批处理执行被中止。
如果一个批处理脚本是从另一个批处理脚本call
编辑的,或者在子例程中,这是相关的。
如果您想结束*.bat
文件或子例程的执行,请使用goto :eof
(注意冒号)——这类似于在脚本的最后放置一个标签,然后使用goto
跳转到它。
但是,exit /b
允许退出脚本并设置ERRORLEVEL
code为指定值。这只会从运行子例程或批处理脚本返回,而不会像普通exit
那样终止cmd.exe
。
更多关于exit
的信息可以在这里找到