脚本专栏 
首页 > 脚本专栏 > 浏览文章

dos if 条件判断

(编辑:jimmy 日期: 2024/11/1 浏览:3 次 )

1、判断驱动器、文件或文件夹是否存在,用 if exist 语句;
  2、判断某两个字符串是否相等,用 if "字符串1"=="字符串2" 语句;
  3、判断某两个数值是否相等,用 if 数值1 equ 数值2 语句;
  4、判断某个变量是否已经被赋值,用 if defined str 语句;

  if语句的完整格式是这样的:if 条件表达式 (语句1) else (语句2),它的含义是:如果条件表达式成立,那么,就执行语句1,否则,将执行语句2。

  对于以上四种情形,可以分别使用如下代码:

  1、if exist d:\test.txt (echo D盘下有test.txt存在) else (echo D盘下不存在test.txt)
  2、if "abc"=="xyz" (echo 字符串abc等于字符串xyz) else (echo 字符串abc不等于字符串xyz)
  3、if 1 equ 2 (echo 1等于2) else (echo 1不等于2)
  4、if defined str (echo 变量str已经被赋值,其值为%str%) else (echo 变量str的值为空)

  判断字符串是否相等的时候,if会区分大小写,比如,单纯的if语句会认为字符串abc和字符串Abc不相同,若不想区分大小写,则需要添加 /i 开关,使用 if /i "字符串1"=="字符串2" 的格式;另外,等于符号是连续的"=="而非单独的"="。

  判断两个数值之间的大小关系,除了等于用equ之外,还有其他的关系符号,所有适用于if语句的关系符号见下表:

中文含义 关系符 英文解释

等于 equ equal
大于 gtr greater than
大于或等于 geq greater than or equal
小于 lss less than
小于或等于 leq less than or equal
不等于 neq no equal

  if语句还有一个精简格式:if 条件表达式 语句,它的含义是:如果条件表达式成立,将执行语句,否则,什么也不做。

学习if条件语句

学习要点:
5种if语句的基本语法:
1。判断两个字符串是否相等,if "字符串1"=="字符串2" command 语句;
2。判断两个数值是否相等,if 数值1 equ 数值2 command 语句;
3。判断判断驱动器,文件或文件夹是否存在,if exist filename command 语句;
4。判断变量是否已经定义,if defined 变量 command 语句;
5。判断上个命令的返回值,if errorlevel 数值 command 语句。
------------------------------------------------------------------------------------------------------


1。判断两个字符串是否相等,if"字符串1"=="字符串2" command 语句
   注意:在"字符串1"=="字符串2"中,是两个连续的"="

例1

@echo off
set /p var1=请输入第一个比较的字符:
set /p var2=请输入第二个比软的字符:
if "%var1%"=="%var2%" (echo 输入的两个字符相同) else echo 输入的两个字符不相同
pause

执行后会要求你输入两个字符串,然后批处理判断它俩是否相同。在判断字符串是否相等的时候,if是会区分大小写
的,请看,

例2

@echo off
if "a"=="A" (echo 输入的两个字符相同) else echo 输入的两个字符不相同
pause

执行后会显示:输入的两个字符不相同
如果我们不想让它区分大小写,则可以加上/i 参数。再看下面这个例子,

例3

@echo off
if /i "a"=="A" (echo 输入的两个字符相同) else echo 输入的两个字符不相同
pause

这次执行后会显示:输入的两个字符相同
------------------------------------------------------------------------------------------------------


2。判断两个数值是否相等,if 数值1 equ 数值2 command 语句
语句中的equ 表示相等的意思,判断两个数值之间的大小关系还有以下关系符号:

中文含义       关系符       英文解释
等于            equ          equal
大于            gtr          greater than
大于或等于      geq          greater than or equal
小于            lss           less than
小于或等于      leq          less than or equal
不等于          neq          no equal

我们还是来看个例子,

例4

@echo off 
set /p var=请输入一个数字: 
if %var% geq 10 (echo 此数大于或等于10) else echo 此数小于10
pause

注意哦,批处理中的大于号,小于号,等于号等等都不能用:“>”  “<”  “=” 这些符号,而要用像"gtr"这类
的。


☆注意:if 比较字符串与比较数字 之间的区别,它们的区别体现在引号""上面,请看下面的例子

【example 1】

@echo off
if "12" lss "4" (echo 12竟然小于4哦"htmlcode">
@echo off
if 12 lss 4 (echo 12竟然小于4哦""会出错呢?

原因如下:
   如果要比较的两个元素加了双引号"",那么会被当成是字符的比较。两个元素作比较的流程是:先比较两个元素
的首位,如果首位相同,再比较第二位,如果第二位相同,再比较第三位。。。依此,在【example 1】if "12" lss
 "4" 语句中,实质是1与4的比较,1当然小于4,所以执行了后面的命令:echo 12竟然小于4哦"" 是数字的比较就不用双引号了!
------------------------------------------------------------------------------------------------------


3。判断判断驱动器,文件或文件夹是否存在,if exist filename command 语句
我们来瞧瞧这个判断驱动器,文件或者文件夹是否存在的语句,这里if exist filename 是表示:存在 filename的
意思。

例5

@echo off 
if exist "e:" (echo e盘存在) else echo e盘不存在 
pause>nul

这里是判断e: 是否存在!

例6

@echo off
if exist d:\123.bat (echo 123.bat文件存在!) else echo 123.bat文件不存在! 
pause

这个例子是用来判断123.bat文件是否存在的,但并不严谨!如果123.bat是一个文件夹而不是一个文件时,上面的判
断就不行了!那么如何判断指定的文件123.txt是否存在?请看:

@echo off
dir /a-d d:\123.bat >nul 2>nul
if %errorlevel%==0 (echo 123.bat文件存在!) else echo 123.bat文件不存在! 
Pause

先用dir的/a-d参数去除123.bat的目录属性,指定说明要搜索的123.bat是文件而不是文件夹,并把结果(包括正确
和错误)屏蔽(>nul 2>nul),如果dir找到了文件123.bat,那么其errorlevel值(dir命令的退出编码)会被设为0,否
则为1则是没有此文件。当然也可以用||和&&来判断。关于为什么要用if %errorlevel%==0 而不用if errorlevel 0
呢?在后面if errorlevel中会有说明!

例7

@echo off
if exist test\ (echo test 是文件夹) else echo test 是文件
pause

这里是判断文件夹是否存在。对于文件夹存在的判断,我们不可以用以下两种写法:

第①种

@echo off
if exist test\. (echo test 是文件夹) else echo test 是文件
pause


第②种

@echo off
if exist test\nul (echo test 是文件夹) else echo test 是文件
pause


4。判断变量是否已经定义,if defined 变量 command 语句
这是一个判断变量是否已被定义的语句,我们还是先看例子,

例8

@echo off
if defined a (echo 变量 a 已定义) else (echo 变量 a 没有被定义)
pause

执行后显示:变量 a 没有被定义

例9

@echo off
set a=
if defined a (echo 变量 a 已定义) else (echo 变量 a 没有被定义)
pause

执行后显示:变量 a 没有被定义

注意:set a=这后面是没有空格的。

例10

@echo off
set a=10
if defined a (echo 变量 a 已定义) else (echo 变量 a 没有被定义)
pause

执行后显示:变量 a 已定义

   看了上面三个例子,你应该发现点什么了吧?现在我们应该知道了:当变量不存在或是值为空时,变量则为未定
义。
   当我们用if defined 变量 command 语句判断变量是否被定义时,请注意 变量 为不使用引导符号%的变量名,不
能用写为%变量%,否则出错。

大家来试一下下面的这两个例子,

例11

@echo off
set var1=5
if defined var1 (echo 变量var1已定义) else (echo 变量var1没有被定义)
set /p var2=请输入一个数字:
if defined %var2% (echo 变量var2已定义) else (echo 变量var2没有被定义)
pause

例12

@echo off
set var1=5
if defined var1 (echo 变量var1已定义) else (echo 变量var1没有被定义)
set /p var2=请输入一个数字:
if defined var2 (echo 变量var2已定义) else (echo 变量var2没有被定义)
pause

注意例11和例12哦:一个是%var2%而另一个是var2


5。判断上个命令的反回值,if errorlevel 数值 command 语句
这个语句是用于判断上一个命令执行的返回值errorlevel,我们还是先来看看例子,

例13

@echo off 
net user 
if %errorlevel% == 0 (echo net user 命令执行成功) else (echo net user 命令执行失败) 
Pause

注意:%errorlevel%  这是个系统变量,所以用两个%括起来,这里的==为两个连续的=
也许有些朋友说我上面的例子是不是写错了?按照语法应该写成“if errorlevel 0”才对的呀。
如果你是这样用的话,那你就错了,还真不信呀?OK,我们来设计个实验看看

例14

@echo off 
set /p input=请输入任意一条命令: 
if errorlevel 0 (echo %input% 命令执行成功) else (echo %input% 命令执行失败)
pause

用这种语法,不管你前面的命令,是否执行成功,它都会认为命令成功了。何解?


if errorlevel  语句的特点:
当使用  if errorlevel 0 cmmand 句式时,它的含义是:如果返回的错误码值大于或等于0 的时候,将执行cmmand
操作;
当使用  if %errorlevel%==0 cmmand 句式时,它含义是:如果返回的错误码值等于0 的时候,将执行cmmand操作。

一般上一条命令的执行结果返回的值只有两个,"成功"用0 表示 "失败"用 1 表示,实际上,errorlevel 返回值可
以在0~255 之间,
例如xcopy 默认的errorlevel 值就有5 个,分别表示5 种执行状态:

0复制文件成功
1 未找到复制文件
2 用户通过CTRL C 终止了xcopy操作
4 出现了初始化错误 
5 出现了磁盘写入错误


   对于if 条件语句,常用的也就上面那5条吧,下面我们来看一下它的两种格式:

if条件语句的完整格式是:if 条件表达式 (语句1) else (语句2)
它的含义是:如果 条件表达式 成立,就执行 语句1,否则,将执行 语句2。"htmlcode">

@echo off 
if exist "d:\123.txt" (del "d:\123.txt")
pause

你也可以写成下面这样

例16

@echo off 
if exist "d:\123.txt" del "d:\123.txt"
pause

补充1:if not 语句
对于if 语句前面的5种基本语法,都可以加上not参数,如
1。if not "字符串1"=="字符串2" command 语句;
2。if not数值1 equ 数值2 command 语句;
3。If not exist filename command 语句;
4。if not defined 变量 command 语句;
5。if not errorlevel 数值 command 语句。

   在if 条件表达式 (语句) 语句,如没有not参数,默认是判断条件成立时,执行语句;如有not参数,判断条件失
败时,执行语句。

我们看一下下面的例子:

例17

@echo off
if exist "c:\" (echo C盘存在) else echo C盘不存在
pause

执行后显示:C盘存在

例18

@echo off
if not exist "c:\" (echo C盘存在) else echo C盘不存在
pause

执行后显示:C盘不存在

不会吧,例18中执行后显示:C盘不存在,这简值是在说瞎话了,那到底是什么回事呢?

if not exist "c:\" (echo  C盘存在) else echo  C盘不存在
此语句中文意思:如果不存在C:\ 就执行显示C盘存在;否则<指的是存在C:\>就执行显示C盘不存在。
注:if exist 意为如果存在,那么if not exist就是如果不存在

你的C盘当然是实实在在存在的啦,根椐上面的中文分得知,那执行例18后就显示为:C盘不存在  通过分析例18,你
应该明白if语句中not参数是怎么用了吧!


补充2:IF语句嵌套的写法,我们先来看看

例1

@echo off
set a=55
if %a% geq 50 (
  if %a% geq 80 (
    if %a% geq 100 (
      echo a大于等于100 
    ) else echo a小于100 
  ) else echo a小于80 
) else echo a小于50 
pause

这是一种比较规范的写法,那这种写法是怎样写的呢?那我们一步步的来:

第一步:

if %a% geq 50 ( ) else echo a小于50

第二步:在第一步geq 50 后面的括号()里按两下回车,主要是空两行出来。

if %a% geq 50 ( 
  if %a% geq 80 ( )else echo小于80
) else echo a小于50

第三步:在第二步geq 80 后面的括号()里按两下回车,主要是空两行出来。

if %a% geq 50 ( 
  if %a% geq 80 ( 
   if %a% geq 100 ( ) else echo a小于100
  )else echo小于80
) else echo a小于50

第四步:在第三步geq 100 后面的括号()里按两下回车,主要是空两行出来。

if %a% geq 50 ( 
  if %a% geq 80 ( 
   if %a% geq 100 (
     echo a大于等于100
   ) else echo a小于100
  )else echo小于80
) else echo a小于50

   上面的代码中,if  %a% 和 )else 要适当的缩进,以达到写书清晰!

上一篇:批处理 FOR参数/F之tokens详解
下一篇:批处理FOR 中的Delims和Tokens总结