CMD 常用命令74 条

if 条件判断

批处理分支语句:判断文件存在、字符串相等、数字大小与 errorlevel,是自动化里做逻辑判断的核心。

Windows 运维速查系统更新于 2026-10-13

命令是干什么的

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!。

易错点

  • if errorlevel n 是大于等于语义,用来判断“等于”会误命中更大的错误码
  • 字符串比较不带引号,变量为空或含空格时直接语法错误
  • 括号块内取 %ERRORLEVEL% 得到解析期快照,判断结果与实际不符
  • if exist 无法区分文件与目录,需要区分时对目录路径加尾部反斜杠,或改用 PowerShell 的 Test-Path -PathType

数据来源与参考

  • Microsoft Learn:if 命令

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌