Board logo

标题: [原创] 批处理条件判断IF命令中级教程 [打印本页]

作者: cjiabing    时间: 2011-4-29 13:10     标题: 批处理条件判断IF命令中级教程

犹豫再三,还是决定写这个教程,因为IF很有用,而且不必花太多时间。以下代码未经全部验证,可能有错的。适合初级和中级阅读,未详之处请待后面分解。
IF,我们称为条件判断命令,假如怎么样,然后怎么样,满足某个条件就进行指定的操作,不满足就进行另外的操作。常用于字符关系判断、文件存在判断、变量赋值判断等等。下面我们按照常见的用法讲解。
第一、字符相符比较。
1、基本用法:
比如,我们要判断“牛头”和“马嘴”这两个字符是否相等。
@echo off
if  牛头 == 马嘴 echo “牛头”等于“马嘴”
pause
讲解:如果“牛头”等于“马嘴”,就显示牛头”等于“马嘴”。因为这两个词语写法不同,是不会相等的,所以没有显示结果。
注意,要比较的两个字符位于“双等于号”即“==”的两边,通常用双引号括起来。比如:
@echo off
set var=abc
if "%var%"=="abc" echo 变量%var%的值是“abc”。
pause
2、默认区分字母大小写:
if  a == A echo “a”等于“A”
讲解:假如小写字母“a”等于大写字母“A”,就显示“a”等于“A”。系统默认是区分字母大小写的,所以结果不相等。如果不需要区分字母的大小写呢?
3、不区分字母大小写——使用参数“/i”
if /i  a == A echo “a”等于“A”
讲解:在IF命令后面使用参数“I”,表示不区分字母大小写。
区分大小写能够进行更精确的判断,不区分大小写则可以扩大判断的范围。
4、不符合条件的判断——使用参数“NOT”。
if not  a == A echo “a”不等于“A”
讲解:假如小写字母“a”不等于大写字母“A”,就显示“a”不等于“A”。
5、双重条件判断
假如我需要进行双重条件判断,符合条件的情况执行什么命令,不符合条件的情况下执行另外的命令,如何做到?
我们来个综合的例子:
set /p var=请输入数字、字母或汉字:
set /p str=请输入数字、字母或汉字:
if %var% == %str% (echo %var%与%str%相等) else (echo 两者不相等)
讲解:首先使用set设置输入变量%var%和%str%,然后对这两个变量进行判断。假如相等就显示“%var%与%str%相等”,否则“else”就显示“两者不相等”。
else是否则的意思。通常,else前后的命令需要用括号括起来,表示两者相反的情况下分别执行的命令。
IF string1 == string2 (command1) else (command2)
假如命令在同一行,else后面的命令也可以不用括号:
IF string1 == string2 (command1) else command2
再来看例子:
If 1==2 (echo 1等于2) else (echo 1不等于2)
把它拆开,其实它就是下面两句的组合:
If 1==2 echo 1等于2
If not 1==2 echo 1不等于2
参数“/I”、“NOT”、else的合用:
if /i not  a == A (echo “a”不等于“A”) else (echo “a”等于“A”)

6、技巧:在某些条件判断中,“IF string1 == string2 (command1) else (command2)”,往往表示非此即彼的两极判断,但运用起来会比较灵活。
IF可以进行复杂的判断,可以进行多层嵌套。
@echo off
for /l %%a in (1,1,5) do (
    if %%a==4 (echo %%a 是偶数) else (
        if %%a==2 (echo %%a 是偶数) else (echo %%a 是奇数)
    )
)
pause
讲解:使用FOR输出1至5五个数字。第一个IF,首先判断输出等于4时的情况,否则进入更具体的判断。第二个IF,深入判断输出不符合4的情况,这些情况中首先判断输出等于2的情况,以及不等于2的情况。
总共进行了两层的嵌套,假如将FOR中的5改为“10”等,以上输出的奇数和偶数判断就不准确了,需要进行更输入的逻辑判断。但在实践中,假如对后面的数字要求不高的时候,可以以此来忽略。
7、使用双引号
注意变量、标点符号等一些特殊字符的比较需要双引号,如:
set var=我爱批处理
if /i "%var:~1,1%"=="爱" echo 第二个字是:爱。
一般字符串(数字除外)如果不能保证输入的字符是否有效值,最好使用双引号括起来。
可以用来判断空格:
set str=
if  "%str%"=="" echo %str% 为空值
如果没有双引号就会出错。有时候,有些人也用大括号{}来代替双引号,如:
if /i {%var:~1,1%}=={爱} echo 第二个字是:爱。(待)

第二、数字比较运算。
1、比较运算符:
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
其中equ与我们上面的“==”是一样通用的。下面举例说明:
@echo off
:a
set /p var=请输入数字:
set /p str=请输入数字:
cls
if %var% == %str% echo (一) %var%与%str%相等
if %var% equ %str% echo (二) %var%与%str%相等
if %var% neq %str% echo (三) %var%与%str%不相等
if %var% lss %str% echo (四) %var%小于%str%
if %var% leq %str% echo (五) %var%小于或等于%str%
if %var% gtr %str% echo (六) %var%大于%str%
if %var% geq %str% echo (七) %var%大于或等于%str%
goto a
2、数字比较不必双引号,特别是非等于判断时。
if "1234567" lss "222" echo 1191 小于 222
讲解:lss是小于的意思。假如1234567 小于 222显示内容。但实际上1234567要远远大于222,所以以上写法是错误的。正确的写法:
if 1234567 lss 222 echo 1234567 小于 222
3、进制比较,注意0开头的数字。借用yslyxqysl的代码:
if 017 equ 15 echo YES
if 0x34 equ 52 echo YES
if 045 equ 0x25 echo YES
pause>nul

第三、文件存在判断——if exist
文件存在判断在处理文件时非常有用。但凡涉及文件操作的,最好在前面添加if exist,避免文件不存在导致的错误。
1、最基本的:
if exist c:\boots.ini start "" c:\boots.ini
假如不使用if exist 而直接用start往往会弹出错误提示。
for %%a in (c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%a: echo 存在 %%a 盘!
讲解:用来判断存在的驱动器,假如存在则显示内容。
也可以用not:
if not exist "C:\Program Files\Tencent\QQ" echo 没有找到QQ安装目录。
2、判断文件是否文件夹:@echo off
set /p str=请输入文件路径:
if exist %str%\. dir /a:d /b %str%&&echo %str%是文件夹||echo %str%是文件
pause
讲解:注意路径名含有空格时,需要双引号括起来。首先使用“%str%\.”判断是否为文件夹,一般可以进行判断,但不能完全处理,需要用dir来搜索目录,根据搜索结果的成“&&”&&和败“||”进行判断。
为何不直接用dir?当当前目录含有大量文件时,启动dir可能占有时间。使用if exist提前判断可以提高效率。
其它方法:
@echo off
if exist  c:\windows\nul (echo 是文件夹) else echo 是文件
pause
@echo off
pushd c:\windows 2>nul&&echo 是文件夹||echo 是文件
popd
pause
@echo off
set "var=%cd%"
cd /d c:\windows 2>nul&&echo 是文件夹||echo 是文件
cd /d "%var%"
pause
3、判断符合指定后缀名的文件
set var=c:\boot.ini
if "%var:~-4.4%"==".ini" 后缀名是“.ini”。

第四、变量赋值判断——defined
判断一个变量是否为已经赋值。也就是判断变量是否为空。
1、defined
set /p var=请按任意键或回车:
if defined var echo ^%var^% 已经被赋值:%var%
讲解:假如变量%var%赋值,则显示后面内容。
注意:此处的变量名不必使用百分号“%”括住。
支持if的其它参数开关:
if not defined var (echo ^%var^% 没有被赋值:%var%) else (echo 已赋值)
当变量名为其它特殊符号时,需要双引号???(待)
2、两种检测空值方法比较
前面我们了解到一种判断变量是否为空的方法:if "%var%"=="" echo %var%为空!此处的 if defined 也有着同样的作用,并且比前者更有效。比较:
if "%var%"=="" ——假如变量是空格……
if not defined var ——假如变量没有任何内容,也没有空格……
注意:空格也是一种特殊的值,准确地说,上者判断的是变量等于空格时的情况,而下者则判断所有情形,包括空格。因此,defined比前者更加彻底,包含了前者。
使用比较:
@echo off
set /p a=输入字母Q:
if /i "%a%"=="q" echo 你输入了字母Q。
set /p b=输入空格:
if "%b%"=="" echo 你输入了空格。(待)
set /p c=直接回车:
if not defined c echo 你直接回车了。
pause
顺便讨论下空文本的检测:(待)

第五、返回码判断
命令执行是否成功,机器会返回一个数字信号,这个数字信号就是返回码——%ERRORLEVEL%,通常包括0和1两种,0表示成功,1表示失败。
返回码可以用来检查我们的代码是否成功执行,以及发行命令中的错误。
1、常用的方法
比如:
dir>nul&IF %ERRORLEVEL% LEQ 0 echo 执行成功!
搜索当前目录中的任意文件,假如返回码等于0,则表示执行成功。
copy
IF %ERRORLEVEL% == 1 echo 备份失败!返回码是:%ERRORLEVEL%
讲解:因为copy命令缺乏被拷贝的文件路径而失败,此时的返回码%ERRORLEVEL%是1。
2、配合goto等命令使用
set /p a=输入搜索路径:
dir %a%
goto answer%ERRORLEVEL%
:answer0
echo 搜索成功 0
pause
exit
:answer1
echo 搜索失败 1
pause
exit
讲解:将标签名变成数字“0”和“1”,而%ERRORLEVEL%的结果通常是这两个数字,因此,%ERRORLEVEL%得到结果时它就会自动跳到相应的标签。
EXIT命令也可以根据上一条命令执行后的返回码自动判断是否结束。比如执行成功时退出:“exit 0”,执行失败时退出“exit 1”。
作者: andy七少    时间: 2011-5-21 15:15

抢到一个沙发!!顶
作者: Hello123World    时间: 2011-9-20 20:55

最好把文章分下段,真心看的眼花。(by the way,不知道namejm那种层次分明的文章结构是怎么弄出来的,先word再复制粘贴?)
作者: cjiabing    时间: 2011-9-20 22:02

回复 3# Hello123World


    哈哈,我也觉得乱,而且超难懂,有空再修改下。用notepad吧?
作者: 等待的狮子    时间: 2022-3-27 13:07

认真学习了好几遍
作者: ANSL    时间: 2022-11-4 20:38

谢谢楼主,学习了!




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2