犹豫再三,还是决定写这个教程,因为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
顺便讨论下空文本的检测:(待)