在上一节我们学习了 if 语句的基础语法(if、if-else 和 if-elseif-else),本节将介绍 if 语句的扩展。
如果命令扩展被启用,IF 会如下改变:
IF [/I] string1 compare-op string2 command IF CMDEXTVERSION number command IF DEFINED variable command
其中, compare-op 可以是:
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
而 /I 开关(如果指定)说明要进行的字符串比较不分大小写。/I 开关可以用于 IF 的 string1==string2 的形式上。这些比较都是通用的;原因是,如果 string1 和 string2 都是由数字组成的,字符串会被转换成数字,进行数字比较。实例:
@echo off if "A" equ "A" echo equ ok if "A" == "A" echo equ ok if /I "A" equ "a" echo equ ok if 100 equ 100 echo equ ok if 100 == 100 echo equ ok
输出结果:
C:\Users\Administrator\Desktop>test.bat equ ok equ ok equ ok equ ok equ ok
CMDEXTVERSION 条件的作用跟 ERRORLEVEL 的一样,除了它是在跟与命令扩展有关联的内部版本号比较。第一个版本是 1。每次对命令扩展有相当大的增强时,版本号会增加一个。命令扩展被停用时,CMDEXTVERSION 条件不是真的。实例:
@echo off echo %CMDEXTVERSION% if CMDEXTVERSION 2 echo 内部版本号为2
输出结果:
C:\Users\Administrator\Desktop>test.bat 2 内部版本号为2
如果已定义环境变量,DEFINED 条件的作用跟 EXIST 的一样,除了它取得一个环境变量,返回的结果是 true。实例:使用 DEFINED 判断变量是否定义
@echo off set val=10 if DEFINED val echo val=%val% if NOT DEFINED val echo 没有定义 val 环境变量 if DEFINED myPath echo val=%myPath% if NOT DEFINED myPath echo 没有定义 myPath 环境变量
输出结果:
C:\Users\Administrator\Desktop>test.bat val=10 没有定义 myPath 环境变量
如果没有名为 ERRORLEVEL 的环境变量,%ERRORLEVEL% 会扩充为 ERROLEVEL 当前数值的字符串表达式;否则,您会得到其数值。运行程序后,以下语句说明 ERRORLEVEL 的用法:
@echo off xcopy tmp.txt D:\tmp\tmp.txt echo ERRORLEVEL=%ERRORLEVEL% goto answer%ERRORLEVEL% rem xcopy 默认的 errorlevel 值就有5个,分别表示5种执行状态 rem 0 复制文件成功 rem 1 未找到复制文件 rem 2 用户通过CTRL C 终止了xcopy操作 rem 4 出现了初始化错误 rem 5 出现了磁盘写入错误 :answer0 echo xcopy 复制文件成功 goto end :answer1 echo xcopy 未找到复制文件 goto end :answer2 echo xcopy 用户通过 CTRL C 终止了xcopy 操作 goto end :answer4 echo xcopy 出现了初始化错误 goto end :answer5 echo xcopy 出现了磁盘写入错误 goto end :end
输出结果:
C:\Users\Administrator\Desktop>test.bat 找不到文件 - tmp.txt 复制了 0 个文件 ERRORLEVEL=4 xcopy 出现了初始化错误
您也可以使用以上的数字比较:
@echo off xcopy tmp.txt D:\tmp\tmp.txt echo ERRORLEVEL=%ERRORLEVEL% IF %ERRORLEVEL% EQU 0 goto answer0 IF %ERRORLEVEL% EQU 1 goto answer0 IF %ERRORLEVEL% EQU 2 goto answer2 IF %ERRORLEVEL% EQU 4 goto answer4 IF %ERRORLEVEL% EQU 5 goto answer5 rem xcopy 默认的 errorlevel 值就有5个,分别表示5种执行状态 rem 0 复制文件成功 rem 1 未找到复制文件 rem 2 用户通过CTRL C 终止了xcopy操作 rem 4 出现了初始化错误 rem 5 出现了磁盘写入错误 :answer0 echo xcopy 复制文件成功 goto end :answer1 echo xcopy 未找到复制文件 goto end :answer2 echo xcopy 用户通过 CTRL C 终止了xcopy 操作 goto end :answer4 echo xcopy 出现了初始化错误 goto end :answer5 echo xcopy 出现了磁盘写入错误 goto end :end
输出结果:
C:\Users\Administrator\Desktop>test.bat 找不到文件 - tmp.txt 复制了 0 个文件 ERRORLEVEL=4 xcopy 出现了初始化错误
如果没有名为 CMDCMDLINE 的环境变量,%CMDCMDLINE% 将在 CMD.EXE 进行任何处理前扩充为传递给 CMD.EXE 的原始命令行;否则,您会得到其数值。
如果没有名为 CMDEXTVERSION 的环境变量,%CMDEXTVERSION% 会扩充为 CMDEXTVERSION 当前数值的字串符表达式;否则,您会得到其数值。
@echo off echo cmdLine=%CMDCMDLINE% echo version=%CMDEXTVERSION%
输出结果:
C:\Users\Administrator\Desktop>test.bat cmdLine=C:\Windows\System32\cmd.exe version=2