命令是干什么的
if 是批处理的分支语句,支持判断文件存在(exist)、字符串比较、errorlevel 数值、变量是否定义(defined)与命令扩展版本,并可接 else 分支。它是批处理自动化里做逻辑判断的核心,其中几个语义与常见编程语言差别较大,必须单独记牢。
errorlevel 的语义
if errorlevel n 表示“错误码大于等于 n”,不是等于;需要精确比较时改用 %ERRORLEVEL% EQU n。在括号块内取 %ERRORLEVEL% 得到的是解析期快照,要拿实时值必须先 setlocal enabledelayedexpansion 再改用 !ERRORLEVEL!。
基本信息
| 适用平台 | Windows 全版本 CMD(Windows 7/10/11 与各版 Server) |
|---|---|
| 语法 | if [not] exist 文件 …;if [/i] "a"=="b" …;if errorlevel n …;if defined VAR … |
| 判断类型 | exist 文件存在、字符串比较、errorlevel 数值、defined 变量、cmdextversion |
| 分支写法 | 单行直接跟命令;多条命令用括号 () 包裹,可接 else |
典型使用场景
- 备份前判断目标目录是否存在,不存在就先创建
- 按命令行参数走不同分支,例如 start 与 stop
- 检查上一步命令的错误码,决定继续还是报错退出
- 判断环境变量是否已设置,未设置时给出明确提示
- 批处理里做幂等判断:文件已存在就跳过生成或下载
常用示例
常用示例
if exist D:\data\app.ini echo 配置存在
if not exist D:\backup md D:\backup
if /i "%1"=="start" echo 启动分支
if errorlevel 8 echo 复制失败(robocopy 阈值语义)
if defined JAVA_HOME (echo 已设置) else (echo 未设置)
:: 括号块内取实时错误码需开启延迟展开
setlocal enabledelayedexpansion
if !ERRORLEVEL! equ 0 echo 上一步成功判断形式读法
| 写法 | 判断内容 | 注意 |
|---|---|---|
| if exist 路径 | 文件或目录是否存在 | 不区分文件与目录 |
| if not exist 路径 | 不存在时成立 | 常与 md 搭配做幂等创建 |
| if "%a%"=="b" | 字符串是否相等 | 不带引号时空值会引发语法错误 |
| if /i | 忽略大小写比较 | 仅对字符串比较有效 |
| if errorlevel n | 错误码大于等于 n | 不是等于,精确比较改用 %ERRORLEVEL% |
| if defined VAR | 变量是否已定义 | 比判断取值是否为空更准确 |
字符串比较一定要带引号,写成 if "%a%"=="b";否则变量为空时表达式会塌陷并直接报语法错误。
括号块内使用 %ERRORLEVEL% 取到的是解析期快照,块内判断实时错误码必须开启延迟变量展开并改用 !ERRORLEVEL!。