HOWTO · Batch
批处理脚本中的 If ELSE 条件
本教程将讨论批处理脚本中 IF ELSE 条件的结构。
本页内容
在 Windows CMD 批处理文件中使用 IF ... ELSE,可以在条件为真时执行一组命令,在条件为假时执行另一组命令。将每组命令放在括号中,并让 ELSE 与真分支右括号处于同一逻辑命令行。以下示例均为批处理文件示例;输出取决于所示输入和环境。示例代码及其输出中的文字标签保持英文。
IF ... ELSE 语法和基本示例
一般形式为 IF condition ( commands-for-true ) ELSE ( commands-for-false )。条件可以检查比较结果或文件属性。如果假值情况不需要执行任何操作,批处理文件可以省略 ELSE。
请在 .bat 文件中运行此示例。它设置两个值并进行比较,然后显示选中的分支。由于 10 小于 20,因此会选中真分支;输出为:
@echo off
set /a left=10
set /a right=20
if %left% LSS %right% (
echo %left% is less than %right%.
) else (
echo %left% is not less than %right%.
)
10 is less than 20.
检查文件时,可以使用 IF EXIST path。如果执行检查时指定的文件或目录存在,就会选中真分支。下面这个完整的批处理文件会创建一个临时文件、检查该文件,然后将其删除:
@echo off
set "sample=%TEMP%\if-else-sample-%RANDOM%.txt"
echo sample>"%sample%"
if exist "%sample%" (
echo File exists.
) else (
echo File does not exist.
)
del "%sample%"
File exists.
如需检查其他文件,请更改路径。如果只需处理文件不存在的情况,IF NOT EXIST path ( commands ) 会在路径不存在时执行这些命令。
批处理中的比较运算符
对于数值条件,CMD 支持 EQU(等于)、NEQ(不等于)、LSS(小于)、LEQ(小于或等于)、GTR(大于)和 GEQ(大于或等于)。这些运算符用于数值比较;比较字符串时请使用 ==。为字符串值加上引号,避免空格或空值破坏条件,例如:IF "%mode%"=="backup" ( echo Backup mode )。
NOT 可用于否定条件,例如 IF NOT EXIST "report.txt" ( echo Create the report first )。在 CMD 的 IF 条件语法中,AND 和 OR 不是直接的逻辑运算符。要同时检查多个条件,可以嵌套使用 IF 语句;要在某个命令成功后运行另一条命令,可以使用 CMD 的 && 命令链接功能,但它与组合条件的行为不同。
嵌套的 IF ... ELSE 条件
如果后续判断取决于前一个判断,可以在一个分支中再放入另一个 IF ... ELSE。下面这个完整示例先检查较高的成绩门槛,再检查下一个门槛:
@echo off
set /a score=85
if %score% GEQ 90 (
echo Grade: A
) else (
if %score% GEQ 80 (
echo Grade: B
) else (
echo Grade: C
)
)
对于 85,第一个条件为假,因此 CMD 会继续判断嵌套条件。由于 85 不低于 80,该分支会显示 B 等级。检查顺序很重要:如果先检查较低的门槛,较高的分数也会符合该条件。
IF ... ELSE 的实用示例
在读取、复制或删除路径之前,先检查文件是否存在会很有用。例如,IF EXIST "%~1" ( ... ) ELSE ( ... ) 会检查传给批处理文件的第一个参数。%~1 会移除该参数两侧的引号;在条件中再次给它加上引号,就能处理包含空格的路径。
脚本也可以尝试执行需要管理权限的操作并检查结果,但单次权限探测并不总是可靠:命令失败的原因可能是服务配置或策略,也可能是权限不足。在 Windows CMD 批处理文件中,可以先运行 net session >nul 2>&1,紧接着使用 IF ERRORLEVEL 1 ( echo The command did not succeed; check permissions and system configuration. ) ELSE ( echo The command succeeded. )。此命令依赖 Windows 服务和账户策略,因此这里只说明其用法,不保证运行结果,也不保证它能准确判断权限。
IF ERRORLEVEL n 会检查前一条命令返回的退出码是否大于或等于 n。此检查必须紧跟在要查看状态的命令之后。不要认为每种失败都意味着账户缺少管理权限。
常见错误和 Windows CMD 的适用范围
这些示例使用 Windows CMD 批处理语法,不适用于 PowerShell 或 Bash 语法。让 ELSE 紧接真分支命令组的右括号;如果插入命令分隔符,或让 ELSE 从新命令行开始,CMD 可能无法将两个分支正确配对。
CMD 读取括号代码块时会展开 %variable%。如果变量在代码块中发生变化,同一代码块后续的 %variable% 引用仍可能使用旧值。如果脚本需要在代码块中读取更新后的值,请使用 setlocal EnableDelayedExpansion 启用延迟展开,并写作 !variable!;请注意,启用延迟展开时,路径或文本中的 ! 本身也可能产生影响。
不要把 AND 或 OR 当作组合两个 IF 比较条件的运算符。请嵌套条件来表达相互依赖的检查,并确保每个 ELSE 都属于预期的 IF。比较字符串时,请给两侧都加上引号,例如 IF "%first%"=="%second%",以免空格或缺失值改变 CMD 对比较式的解析方式。