批处理文件:两个连续的 IF
Posted
技术标签:
【中文标题】批处理文件:两个连续的 IF【英文标题】:Batch file: Two consecutive IFs 【发布时间】:2021-10-02 19:45:24 【问题描述】:我正在尝试理解批处理文件中 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
每次都会被执行,无论输入如何。
【问题讨论】:
【参考方案1】:if
command 支持一些特殊(不区分大小写)关键字:
exist
(检查文件是否存在)
defined
(检查环境变量)
ErrorLevel
(检查最后一个错误)
CmdExtVersion
(检查命令扩展)
如果紧跟在if
、if /I
、if not
或if /I not
后面遇到这些,则进入特殊比较模式。如果这些关键字都不存在,则需要对两个值进行正常比较(使用比较运算符 ==
强制进行字符串比较,或使用 equ
、neq
、gtr
、geq
、@ 之一987654339@, leq
尝试将这两个值解释为整数并将它们进行比较,或者,如果不可能,将它们作为字符串进行比较。
由于您在if
命令之后立即声明了关键字errorlevel
,因此需要一个数值。等号不再特殊处理,而是像SPACE一样被视为标准标记分隔符,根据this section1,以及多个连续的分隔符合并为一个。
因此,您的命令行if errorlevel == #
等价于if errorlevel #
,这意味着如果ErrorLevel
大于或等于#
。出于这个原因,您不能交换两个if
命令行,因为2
的errorLevel
值也将满足1
值的上述条件。
1) 实际上,此列表中缺少垂直制表符(代码
0x0B
)和不间断空格(代码0xFF
)。
【讨论】:
您曾经在(同时已删除)评论中链接的example 是一个非常糟糕的评论,那里提供的代码包含许多问题。但是一个非常好的批处理脚本资源是SS64... 谢谢。看起来第一张海报删除了我的评论所在的答案。以上是关于批处理文件:两个连续的 IF的主要内容,如果未能解决你的问题,请参考以下文章