-----siwuxie095
if
执行批处理程序中的条件处理
语法:
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
参数说明:
NOT 指定只有条件为 false 的情况下,Windows 才
应该执行该命令。
ERRORLEVEL number 如果最后运行的程序返回一个等于或大于
指定数字的退出代码,指定条件为 true。
string1==string2 如果指定的文字字符串匹配,指定条件为 true。
EXIST filename 如果指定的文件名存在,指定条件为 true。
command 如果符合条件,指定要执行的命令。如果指定的
条件为 FALSE,命令后可跟 ELSE 命令,该命令将
在 ELSE 关键字之后执行该命令。
IF的三个格式
(1)结果判断:IF [NOT] ERRORLEVEL number do command
(2)比对判断:IF [NOT] string1==string2 do command
(3)存在判断:IF [NOT] EXIST filename do command
(1)IF [NOT] ERRORLEVEL number do command
if errorlevel 这个句子必须放在某个命令的后面,执行该命令后才由if errorlevel
来判断命令的返回值number,其取值范围是 0~255,返回值大于等于指定值时,
条件成立。
即:
if errorlevel 0 如果返回值大于等于0,即前面的程序执行成功
if errorlevel 1 如果返回值大于等于1,即前面的程序执行失败,
失败原因有多种,不同失败有不同的失败代码
if not errorlevel 0 如果返回值小于0,即前面的程序执行失败,
不常用,由于errorlevel不可能小于0,所以无论如何程序
都不会执行后面的语句
if not errorlevel 1 如果返回值小于1,即前面的程序执行成功,
也不常用,不如 if errorlevel 0 更加直接
使用 errorlevel 时,一般用 0 表示成功,用 1 表示失败。但也可以用
0~255的任意一个数值表示 errorlevel。
如:查看C盘根目录
@echo off dir c: if errorlevel 1 goto 1 if errorlevel 0 goto 0 exit :0 echo 命令执行成功 ! goto exit :1 echo 命令执行失败 ! goto exit :exit pause |
sublime中:
运行一览:
再如:查看电脑中不存在的Z盘的根目录
@echo off dir z: if errorlevel 0 goto success if errorlevel 1 goto fail exit :success echo 命令执行成功 ! goto exit :fail echo 命令执行失败 ! goto exit :exit pause |
sublime中:
运行一览:
此程序无论执行成功与否,都显示"命令执行成功 !"
因为errorlevel的取值范围是0~255,无论程序执行结果如何,
if errorlevel 0 总是成立,都会 goto success。将上下两个 if
互换位置即可
sublime中:
运行一览:
还可以采用 IF %ERRORLEVEL% == number do command 的形式来确切比对,
这样就不用考虑顺序问题
(其实和 IF [NOT] string1==string2 do command 一样)
@echo off dir c: if %errorlevel% == 0 goto 0 if %errorlevel% == 1 goto 1 :0 echo 命令执行成功 ! goto exit :1 echo 命令执行失败 ! goto exit :exit pause |
sublime中:
(2)IF [NOT] string1==string2 do command
注意:比对字符时,大小写也会严格比对
if string1==string2 do command
如果 string1 和 string2 相同 ,则执行 command
if not string1==string2 do command
如果 string1 和 string2 不同 ,则执行 command
用 "/i "开关忽略大小写,才会认为 "A=a" :
if /i string1==string2 do command
忽略大小写,如果 string1 和 string2 相同,则执行 command
if /i not string1==string2 do command
忽略大小写,如果 string1 和 string2 不同,则执行 command
("== "前面和后面可以有空格,也可以没有空格)
特别注意:string1或string2中任何一个字符串出现了空格,比较
就不能继续下去,程序会自动退出。为避免这种情况,可以采用
加双引号的形式:
if [not] "string1"=="string2" command
包含空格在内的整个字符串的比对,即空格也会被当成符号来比对。
所有的比对都应采用这种加引号的形式,确保万无一失(除非比较
纯数字的大小,不宜加双引号,避免被认为是字符串比对)
上面的仅仅是格式,实际在程序中的书写形式为:
if [not] %string1%==%string2% command
if [not] "%string1%"=="%string2%" command
如:不加引号的比对
@echo off SET /P a=请输入 string1: set /p b=请输入 string2: if %a%==%b% goto fist if not %a%==%b% goto second exit :fist echo 两个字符串相同 pause exit :second echo 两个字符串不同 pause exit |
sublime中:
运行一览:
再如:加引号的比对(可以比对带空格的字符串)
@echo off SET /P a=请输入 string1: set /p b=请输入 string2: if "%a%"=="%b%" goto fist if not "%a%"=="%b%" goto second exit :fist echo 两个字符串相同 pause exit :second echo 两个字符串不同 pause exit |
sublime中:
运行一览:
(所有字符串的比对最好都带上引号,避免因为空格导致程序错误退出)
再如:
@echo off set string1=abcdefg set string2=1234567 if not %string1%==%string2% (echo 不同) else (echo 相同) pause |
sublime中:
运行一览:
(3)IF [NOT] EXIST filename do command
用于判断存在情况
if exist filename do command 如果存在,执行 command
if not exist filename do command 如果不存在,执行 command
如:F盘根目录下是否存在 abc.txt
@echo off if exist "F:abc.txt" echo 文件存在 ! if not exist "F:abc.txt" echo 文件不存在 ! pause |
sublime中:
IF 增强的用法 :
IF [/I] string1 compare-op string2 command
IF CMDEXTVERSION number command
IF DEFINED variable command
其中/I 是忽略大小写,有了/I,程序会认为 A=a
IF [/I] string1 compare-op string2 command
常用的数学符号在批处理中已有特殊意义和用途,批处理中重新
定义了这些符号:
equ | 等于 |
neq | 不等于 |
lss | 小于 |
leq | 小于或等于 |
gtr | 大于 |
geq | 大于或等于 |
/i | 忽略大小写 |
如:
@echo off set /p a=请输入 string1: set /p b=请输入 string2: if %a% equ %b% goto first if %a% lss %b% goto second if %a% gtr %b% goto third exit :first echo string1 等于 string2 pause goto end :second echo string1 小于 string2 pause goto end :third echo string1 大于 string2 pause :end exit |
sublime中:
这种不加引号的形式,纯数字的比较会将字符转换为数值比较,
包含字母数字的比较则不会转换,且从左到右,只比较第一个不同的
字符的大小
如果加引号,纯数字的比较也不会将字符转换为数值比较,依然是
从左到右,只比较第一个不同的字符的大小(如:出现 3 大于 13)
如:
@echo off set /p var=随便输入个命令: %var% if %errorlevel% == 0 (echo %var%执行成功了) else echo %var%执行失败了 pause |
sublime中:
或者:
运行一览:
IF CMDEXTVERSION number command
如:
@echo off xcopy F:abc.txt E: if cmdextversion 1 echo 文件拷贝失败 if cmdextversion 0 echo 文件拷贝成功 pause |
sublime中:
这里,cmdextversion 条件的作用同 errorlevel
IF DEFINED variable command
用来判断变量是否存在
如果变量已定义或存在,就运行 command 命令
如:
@echo off set str1=ok set str2=no if defined str1 (echo str1 已经被定义) else echo str1 没有被定义 if defined str2 (echo str2 已经被定义) else echo str2 没有被定义 if defined str3 (echo str3 已经被定义) else echo str3 没有被定义 pause |
sublime中:
运行一览:
再如:读入任意字符串,计算并输出字符串的长度
@echo off set num=0 set /p str=请输入任意字符串: if not defined str ( echo 您没有输入任何内容 pause>nul & exit ) :len set /a num+=1 set str=%str:~0,-1% if defined str goto len echo 字符串长度为 :%num% pause>nul |
sublime中:
运行一览:
循环结构
if 和 goto 构成的循环结构
如:
@echo off set num=1 :begin if not %num%==5 ( echo %num% set /a num+=1 goto begin ) pause |
sublime中:
运行一览:
IF ELSE 语句
if 才是批处理命令,而 else 不是,所以无法单独执行 else
而批处理的执行是认行不认命令数目,所以 else 必须和 if 在同一行上
左括号 ( 不是批处理命令,无法单独执行 ( ,所以左括号
必须和上面命令同行
而右括号 ) 是回应前面离它最近的左括号,所以它可以位于
程序的任何地方
如:判断输入是否是字母 a
@echo off rem word和后面的等号 = 之间不能有空格,否则赋值不成功 set /p word=请输入一个字母 : rem 注意:"a" 和后面的左括号间必须有空格,否则程序直接退出,无法运行 rem 注意:else 和前后的左、右括号间必须有空格,否则程序直接退出,无法运行 rem 当 else 和 if 在同一行时(没有嵌套),else后的括号可加可不加,建议加上 if /i "%word%" == "a" (echo a) else (echo not a) pause |
或者
@echo off rem word和后面的等号 = 之间不能有空格,否则赋值不成功 set /p word=请输入一个字母 : rem 注意:"a" 和后面的左括号间必须有空格,否则程序直接退出,无法运行 rem if 和 左括号 必须在同一行,if的右括号 无所谓 if /i "%word%" == "a" (echo a rem if的右括号、else、else的左括号必须在同一行,且三者必须有空格相隔 rem else的右括号 无所谓 ) else ( echo not a ) pause |
sublime中:
或者
关于嵌套:
使用 if 时的注意事项:
1、在 DOS 中,if 每次只能判断一个条件,无法判断多条件,即无
法进行 与、或、异或 等判断。
如果要用到 与、或 条件判断 ,程序写法:
与: if 条件A if 条件B do something |
或: if 条件A do something if 条件B do something |
2、(1)if 和 if的左括号 必须在同一行
(2)if的条件语句 和 if的左括号 之间必须有空格
(3)if的右括号 和 else 和 else的左括号 必须在同一行,且三者间必须有空格
3、if 语句不会进行运算
如:这个程序无法执行
@echo off set /p num=请输入数字: if %num%%%5== 0 echo %num%可以被 5 整除 pause |
sublime中:
必须分开写:
@echo off set /p num=请输入数字: set /a panduan=%num%%%5 if %panduan% == 0 echo %num%可以被 5 整除 pause |
sublime中:
4、下面的代码1的写法不科学,只输入回车时程序错误,自动退出
代码1:
@echo off set /p var=(Y/N): if /i %var%==Y (echo Yes) else (echo No) pause |
sublime中:
代码2:加引号,只输入回车,正确执行,输出 NO
@echo off set /p var=(Y/N): if /i "%var%"==Y (echo Yes) else (echo No) pause |
sublime中:
【made by siwuxie095】