首页 > 解决方案 > 批处理文件:两个连续的 IF

问题描述

我正在尝试了解批处理文件中 IF 的语法。

鉴于此代码(有效):

CHOICE /C YN /M "Do it?"
IF ERRORLEVEL == 2 GOTO skip
IF ERRORLEVEL == 1 GOTO doIt
GOTO end

:doIt
echo Do it!
GOTO end

:skip
echo Abort!
GOTO end

:end

为什么我不能更改两个 IF 的顺序?如果我一开始就写IF ERRORLEVEL == 1 GOTO doIt,我会得到错误的行为。现在Do it每次都会执行,无论输入如何。

标签: windowsif-statementbatch-filecmderrorlevel

解决方案


if命令支持一些特殊(不区分大小写)关键字:

  • exist(检查文件是否存在)
  • defined(检查环境变量)
  • ErrorLevel(检查最后一个错误)
  • CmdExtVersion(检查命令扩展)

if如果紧跟在、或之后遇到任何这些if /I,则进入特殊比较模式。如果这些关键字都不存在,则需要对两个值进行正常比较(使用比较运算符强制进行字符串比较,或使用, , , ,之一来尝试将两个值解释为整数并将它们进行比较,或者,如果不可能,将它们作为字符串进行比较)。if notif /I not==equneqgtrgeqlssleq

errorlevel由于您在命令后立即声明了关键字if,因此需要一个数值。SPACE等号不再特殊处理,而是根据本节1仅将其视为标准标记分隔符,就像 a 一样,并将多个连续的分隔符折叠为一个。

因此,您的命令行if errorlevel == #相当于if errorlevel #,意思是如果ErrorLevel大于或等于#。出于这个原因,您不能交换两个if命令行,因为errorLevelvalue2也将满足该 value 的所述条件1


1) 实际上,此列表中缺少 垂直制表符 (code 0x0B) 和不间断空格 (code )。0xFF

推荐阅读