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

的概述。编辑:

正如Stephan注意到的:

在这种情况下,错误是由命令处理程序引起的将()理解为比较字符串的一部分,而不是作为特殊字符来解释你的语句作为字符串(%ERRORLEVEL%1)之间的比较所以string "(1";与"1)";-它们不匹配所以表达式是假的,但是没有产生错误,因为这是技术上有效的语法(即使它没有做你想要的)

你可以写"%ERRORLEVEL%" == "1"来消除你的意图,但是这里不应该使用括号

尽管echo周围的括号在现代Windows上应该可以在这种特殊情况下工作…

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

这里是批处理脚本中括号的更详细的解释。

exit的附加说明:

你不需要在脚本的末尾加上exit,除非你想要整个批处理执行被中止。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新