cmd 中 if 条件判断
在 Windows 批处理脚本(CMD)中,if
命令是条件判断的核心工具,用于根据不同的条件执行分支命令。其语法灵活且功能强大,以下是详细解析及实用示例。
if
命令的三种基础用法
判断上条命令的退出码(ERRORLEVEL
)
batch
if [not] errorlevel 数字 待执行命令
作用:检查上一条命令的返回码是否大于等于指定数字(非精确匹配。
示例:
batchnet user test if errorlevel 1 echo 上条命令执行失败! :: 若 net user 返回码 ≥1(如 1,2,5),均触发此提示
字符串比较
batch
if [not] "字符串1"==[选项] "字符串2" 待执行命令
关键点:
- 默认区分大小写,添加
/i
选项可忽略大小写(如if /i "A"=="a"
)。 - 变量或含空格的字符串需用双引号包裹,避免解析错误。
- 默认区分大小写,添加
示例:
batchset /p input=请输入 yes 或 no: if /i "%input%"=="yes" (echo 确认) else echo 取消
检查文件/目录是否存在
batch
if [not] exist "路径" 待执行命令
用途:验证文件或文件夹是否存在,常用于依赖资源检测。
示例:
batchif exist "C:\data\log.txt" ( echo 日志文件存在 ) else ( echo 文件缺失,正在创建... type nul > "C:\data\log.txt" )
进阶用法与技巧
嵌套 if
与多条件判断
使用括号
()
组合多条命令,支持else
分支:batchif exist "D:\backup\" ( echo 备份目录已存在 ) else ( mkdir "D:\backup" if errorlevel 1 echo 创建失败! )
变量检查(defined
)
batch
if defined 变量名 待执行命令
场景:判断变量是否被赋值,避免未定义变量导致的错误。
batchset name=Admin if defined name echo 用户名: %name%
结合 goto
实现流程跳转
batch
if %errorlevel% neq 0 goto error_handler
:error_handler
echo 错误代码: %errorlevel%
exit /b 1
常见问题与避坑指南
errorlevel
判断误区if errorlevel 1
表示“返回码 ≥1”,而非“等于1”。精确匹配需用if %errorlevel% equ 1
。- 多命令执行时,需启用变量延迟扩展(
setlocal enabledelayedexpansion
)确保实时获取errorlevel
。
- 字符串比较的空格问题
输入值末尾含空格可能导致误判,用双引号统一格式:
batchif "%var%"=="value" :: 避免 "value " 被误判
数值比较运算符
运算符 | 含义 | 示例 |
---|---|---|
equ | 等于 | if 10 equ %num% |
neq | 不等于 | if %level% neq 0 |
gtr | 大于 | if %count% gtr 100 |
lss | 小于 | if %size% lss 1024 |
实用场景示例
检查管理员身份
检查是否以管理员身份运行,是继续执行,不是则退出 cmd 窗口。
batch
net session >nul 2>&1
if %errorlevel% neq 0 (
echo 请右键【以管理员身份运行】此脚本!
pause
exit
)
根据输入执行不同程序
batch
set /p choice=启动程序 (1=记事本, 2=计算器):
if "%choice%"=="1" start notepad.exe
if "%choice%"=="2" start calc.exe
递归检查目录并创建
batch
if not exist "C:\reports\2024" (
mkdir "C:\reports\2024"
if errorlevel 1 echo 目录创建失败! && exit /b 1
)
注意事项总结
- 括号与空格:
if
后的条件与括号间需有空格(如if exist file (......)
)。 - 错误码范围:
errorlevel
为 0~255,超范围将取模(如 256 变为 0)。 - 嵌套限制:避免多层嵌套导致逻辑混乱,可用
goto
拆分流程。
通过灵活组合 if
、errorlevel
及流程控制命令,可构建健壮的批处理脚本,适应各类自动化需求。