我将从最核心的 IF 命令讲起,然后扩展到其他相关的判断方法。

核心判断:IF 命令
IF 命令是 CMD 脚本中进行逻辑判断的基础,它的基本语法是 IF [NOT] condition command。
IF 命令主要有三种判断方式:
判断字符串是否相等
这是最常见的用法,用于比较两个文本字符串是否相同。
语法:

IF [NOT] ["字符串1"] == ["字符串2"] (命令)
NOT:可选,表示“不等于”。- 字符串可以用双引号 括起来,如果字符串本身包含空格或特殊字符,则必须使用引号。
- 是严格区分大小写的,如果需要不区分大小写的比较,请使用
EQU(见下文)。
示例:
@echo off
set /p user_input=请输入 "yes" 或 "no":
:: 判断用户输入是否为 "yes" (区分大小写)
IF "%user_input%" == "yes" (
echo 你输入的是 yes。
) ELSE (
echo 你输入的不是 yes。
)
:: 判断用户输入是否为 "YES" (不区分大小写)
:: /I 表示不区分大小写
IF /I "%user_input%" == "YES" (
echo 你输入的是 YES (不区分大小写)。
) ELSE (
echo 你输入的不是 YES (不区分大小写)。
)
:: 使用 NOT 判断
IF NOT "%user_input%" == "no" (
echo 你输入的不是 no。
) ELSE (
echo 你输入的是 no。
)
pause
判断数值是否相等
用于比较两个数字是否相等。
语法:
IF [NOT] 数字1 EQU 数字2 (命令)
EQU(EQual):等于NEQ(Not EQual):不等于LSS(LeSS than):小于LEQ(Less than or EQual):小于或等于GTR(GreaTer than):大于GEQ(Greater than or EQual):大于或等于
示例:

@echo off
set /p score=请输入你的分数 (0-100):
IF %score% GEQ 90 (
echo 优秀!
) ELSE IF %score% GEQ 80 (
echo 良好。
) ELSE IF %score% GEQ 60 (
echo 及格。
) ELSE (
echo 不及格。
)
:: 注意:CMD 没有原生的 ELSE IF,需要用嵌套的 IF 来实现
:: 上面的 ELSE IF 实际上是 ELSE ( IF ... )
pause
判断文件或目录是否存在
这是非常实用的功能,用于检查文件或文件夹是否存在。
语法:
IF [NOT] EXIST 路径 (命令)
EXIST:检查指定的路径是否存在,路径可以是文件或目录。
示例:
@echo off
set "file_to_check=C:\Windows\System32\cmd.exe"
IF EXIST "%file_to_check%" (
echo 文件 %file_to_check% 存在。
) ELSE (
echo 文件 %file_to_check% 不存在。
)
set "dir_to_check=C:\temp"
IF NOT EXIST "%dir_to_check%" (
echo 目录 %dir_to_check% 不存在,正在创建...
mkdir "%dir_to_check%"
echo 目录创建成功。
) ELSE (
echo 目录 %dir_to_check% 已存在。
)
pause
扩展判断:ERRORLEVEL
ERRORLEVEL 是一个特殊的系统变量,它存储了上一个程序或命令执行后的退出代码(Exit Code)。
- 通常约定:执行成功时,
ERRORLEVEL为0;执行失败时,为非零值。 IF命令可以检查ERRORLEVEL的值,但它有一个陷阱:IF ERRORLEVEL 1的意思是“ERRORLEVEL大于或等于 1”,而不是“等于 1”。
语法:
IF [NOT] ERRORLEVEL 数字 (命令)
示例:
@echo off
echo 尝试 ping 一个不存在的地址...
ping -n 1 192.0.2.1 > nul
:: ping 失败,ERRORLEVEL 通常为 1
IF ERRORLEVEL 1 (
echo Ping 失败,ERRORLEVEL 大于或等于 1。
)
:: 正确的判断方式(检查是否等于0)
:: IF NOT ERRORLEVEL 0 ... 也可以
IF %ERRORLEVEL% EQU 0 (
echo Ping 成功。
) ELSE (
echo Ping 失败。
)
:: 错误的判断方式(检查是否等于1)
:: IF ERRORLEVEL 1 (echo ...) 会把 2, 3, 4... 的情况也包含进来
:: 所以要判断精确值,最好用 %ERRORLEVEL% EQU 数字
pause
综合示例:一个实用的备份脚本
下面这个脚本结合了 IF 和 ERRORLEVEL,实现了“如果目标文件夹不存在则创建,然后复制文件,并最后判断复制是否成功”的逻辑。
@echo off
set "source_folder=C:\Users\YourUser\Documents"
set "backup_folder=D:\MyBackup\Documents"
:: 1. 判断备份目录是否存在,如果不存在则创建
IF NOT EXIST "%backup_folder%" (
echo [信息] 备份目录不存在,正在创建: %backup_folder%
mkdir "%backup_folder%"
:: 检查创建目录是否成功
IF ERRORLEVEL 1 (
echo [错误] 创建备份目录失败!请检查权限或磁盘空间。
pause
exit /b
)
echo [信息] 备份目录创建成功。
)
:: 2. 执行复制操作
echo [信息] 开始从 "%source_folder%" 备份到 "%backup_folder%"...
xcopy "%source_folder%" "%backup_folder%" /E /I /H /Y > nul
:: 3. 检查 xcopy 的执行结果
:: xcopy 成功时,ERRORLEVEL 为 0
IF ERRORLEVEL 1 (
echo [错误] 备份过程发生错误!
) ELSE (
echo [成功] 备份完成!
)
pause
脚本解释:
IF NOT EXIST "%backup_folder%": 首先检查备份文件夹是否存在。mkdir "%backup_folder%": 如果不存在,就创建它。IF ERRORLEVEL 1: 紧接着检查mkdir命令是否执行成功,如果失败(例如没有权限),脚本会打印错误信息并退出。xcopy ...: 执行文件复制。/E /I /H /Y是常用参数,表示复制所有子目录(包括空目录)、目标是目录则自动创建、复制隐藏/系统文件、确认覆盖。IF ERRORLEVEL 1: 检查xcopy命令是否执行成功。xcopy失败(例如源文件夹不存在),ERRORLEVEL会是非零值,脚本会提示错误。
其他相关判断技巧
使用 DEFINED 变量检查
判断一个变量是否已经被定义。
语法:
IF DEFINED 变量名 (命令)
示例:
@echo off
set "my_var=hello"
IF DEFINED my_var (
echo 变量 my_var 已定义,其值为: %my_var%
)
IF NOT DEFINED another_var (
echo 变量 another_var 未定义。
)
pause
使用 DEFINED 进行空值检查
一个变量即使被定义,也可能没有被赋值(即为空)。DEFINED 可以检查变量是否存在,而 %VAR% 本身在未定义时会为空,所以可以结合使用。
示例:
@echo off
set "empty_var="
:: 检查变量是否被定义(即使值为空)
IF DEFINED empty_var (
echo 变量 empty_var 已定义。
) ELSE (
echo 变量 empty_var 未定义。
)
:: 检查变量是否有值(非空)
:: 注意:如果一个变量未定义,%undefined_var% 也会被视为空
IF "%empty_var%" == "" (
echo 变量 empty_var 的值为空。
) ELSE (
echo 变量 empty_var 的值不为空。
)
pause
| 判断类型 | 命令语法 | 说明 |
|---|---|---|
| 字符串判断 | IF ["str1"] == ["str2"] |
区分大小写,推荐用引号 |
| 不区分大小写 | IF /I ["str1"] == ["str2"] |
忽略大小写进行比较 |
| 数值判断 | IF %num1% EQU %num2% |
EQU(=), NEQ(≠), LSS(<), LEQ(≤), GTR(>), GEQ(≥) |
| 文件/目录存在 | IF EXIST "路径" |
检查文件或文件夹是否存在 |
| 命令执行结果 | IF ERRORLEVEL num |
注意:是“大于或等于” |
| 精确错误码 | IF %ERRORLEVEL% EQU num |
推荐用法,用于精确判断错误码 |
| 变量是否定义 | IF DEFINED varname |
检查变量是否已定义,即使值为空也返回真 |
掌握这些 IF 命令的用法,你就可以编写出功能强大、能够处理各种情况的 CMD 批处理脚本了。
