批处理文件:两个连续的 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(检查命令扩展)

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

由于您在if 命令之后立即声明了关键字errorlevel,因此需要一个数值。等号不再特殊处理,而是像SPACE一样被视为标准标记分隔符,根据this section1,以及多个连续的分隔符合并为一个。

因此,您的命令行if errorlevel == # 等价于if errorlevel #,这意味着如果ErrorLevel 大于或等于#。出于这个原因,您不能交换两个if 命令行,因为2errorLevel 值也将满足1 值的上述条件。


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

【讨论】:

您曾经在(同时已删除)评论中链接的example 是一个非常糟糕的评论,那里提供的代码包含许多问题。但是一个非常好的批处理脚本资源是SS64... 谢谢。看起来第一张海报删除了我的评论所在的答案。

以上是关于批处理文件:两个连续的 IF的主要内容,如果未能解决你的问题,请参考以下文章

预处理具有分类和连续特征的大型数据文件

使用R连续运行多个批处理文件?

为啥我不能使用 gcloud 的批处理文件连续运行 2 个命令

批处理Move用法

在opencv中读取视频文件的连续图像

BATCH 文件中多个文件名的条件 IF EXIST 语句