if 语句扩展

在上一节我们学习了 if 语句的基础语法(if、if-else 和 if-elseif-else),本节将介绍 if 语句的扩展。

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
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号