在上一节我们学习了 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 okCMDEXTVERSION 条件的作用跟 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