Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
If statement if语句中的ERRORLEVEL不能正常工作_If Statement_Batch File_Cmd_Errorlevel - Fatal编程技术网

If statement if语句中的ERRORLEVEL不能正常工作

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 此处不显示任何消息…是否

在此批处理文件中,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 %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"
)