bat批处理 if 命令示例详解

所属分类: 脚本专栏 / DOS/BAT 阅读数: 410
收藏 0 赞 0 分享

if 命令示例详解

if,正如它E文中的意思,就是“如果”的意思,用来进行条件判断。翻译过来的意思就是:如果符合某一条件,便执行后面的命令。

主要用来判断

1、两个“字符串”是否相等;

2、两个数值是大于、小于、等于,然后执行相应的命令。

当然还有特殊用法,如结合errorlevel:if errorlevel 1 echo error
或者结合defined(定义的意思):if defined test (echo It is defined) else echo It isn't defined

使用 if 命令判断上一条命令的退出代码

左括号的左边需要有空格
else 右边需要有空格左边建议有空格
右括号、else、左括号需要放在同一行

@echo off
echo www.jb51.net | findstr "jb51"
if %errorlevel% equ 0 (
echo 找到指定字符串
) else (
echo 没有找到指定字符串
)
pause

if errorlevel 0 判断的是 errorlevel 是否大于等于 0

@echo off
echo www.jb51.net | findstr "jb51"
if errorlevel 1 (
echo 没有找到指定字符串
) else (
echo 找到指定字符串
)
pause

但 把 if errorlevel 0 放在最前面在逻辑上是错误的

if errorlevel 0 (
echo 找到指定字符串
) else if errorlevel 1 (
echo没有找到指定字符串
)

使用 if 命令判断文件是否存在

不使用反斜线的情况下 if exist 命令无法直接区分文件和文件夹

判断文件夹的时候在最后加上反斜线

@echo off
if exist "C:\Program Files\" (
echo 文件夹存在
) else (
echo 文件夹不存在
)
pause

判断文件的时候先排除文件夹

if not 表示条件不成立的情况下执行命令

@echo off
if not exist "1.txt\" (
if exist "1.txt" (
echo 文件存在
) else (
echo 文件不存在
) )
pause

使用 if 命令进行字符串比较

使用 == 判断两个字符串或数字是否相等

if 1 == 1 echo yes
if "a" == "a" echo yes

使用 /i 可以忽略字母大小写

if "a" == "A" echo yes
if /i "a" == "A" echo yes

数字比较不要使用双引号
使用双引号之后会变成字符串比较

if 2 gtr 10 echo yes
if "2" gtr "10" echo yes

比较操作符

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

批处理if命令字符串比较和ASCII的关系

数字小于字母。 
同一个字母,小写字母小于大写字母。
不同的字母,按照字母表中的顺序排列。

扩展阅读

https://www.jb51.net/article/223121.htm

http://bbs.bathome.net/thread-12314-1-1.html

http://bbs.bathome.net/thread-12329-1-1.html

if命令知识点(1)变量延迟扩展

复合语句需要启用变量延迟扩展

错误写法

@echo off
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" (
echo 重新赋值成功
) else (
echo 重新赋值失败
) )
pause

正确写法

@echo off
setlocal enabledelayedexpansion
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" (
echo 重新赋值成功
) else (
echo 重新赋值失败
) )
pause

错误写法

@echo off
for %%i in ("C:\Windows\*.exe") do (
set list=%list% %%i
)
echo %list%
pause

正确写法

@echo off
setlocal enabledelayedexpansion
for %%i in ("C:\Windows\*.exe") do (
set list=!list! %%i
)
echo %list%
pause

批处理中的变量延迟扩展、变量嵌套

http://bbs.bathome.net/thread-2899-1-1.html

if命令知识点(2)删除重复行

使用 if defined 命令删除文本中的重复行

@echo off
for /f "delims=" %%i in (1.txt) do (
if not defined _%%i (
echo,%%i
set "_%%i=1"
) )
pause

C:\>type 1.txt
bbs
bathome
net
bathome

C:\>test.bat
bbs
bathome
net
请按任意键继续. . .

这个方法不适合用来处理非常大的文件,而且无法处理包含等号的行,参考:

http://bbs.bathome.net/thread-4690-1-1.html

下面是一些补充

用法示例:

1、检测字符串(注意,用if检测字符串是否相等的时候,后面用的不是“=”,而是“==”):

@echo off 
set "str=this is a test" 
REM 检测变量%str%是否等于test,如果相等,显示OK,否则显示NO 
if "%str%"=="test" (echo OK) else echo NO 
pause>nul 

2、检测数值:(注意,批处理中大于符号不能用:“>”,而用"gtr",其它的也类似)

比较运算符一览:
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
检测数值 20 是否大于 15演示代码:

@echo off 
set /a num1=20 
set /a num2=15 
if %num1% gtr %num2% echo %num1%大于%num2% 
if %num1% EQU %num2% echo %num1%等于%num2% 
if %num1% LSS %num2% echo %num1%小于%num2% 
pause>nul 

3、if结合errorlevel使用:

说明:环境变量errorlevel的初始值为0,当一些命令执行不成功,就会返回一个数值,如:1 ,2 等
IF-ERRORLEVEL
测试代码:

@ECHO OFF  
XCOPY F:\test.bat D:\  
IF ERRORLEVEL 1 ECHO 文件拷贝失败  
IF ERRORLEVEL 0 ECHO 成功拷贝文件 

如果文件拷贝成功,屏幕就会显示“成功拷贝文件”,否则就会显示“文件拷贝失败”。
IF ERRORLEVEL 是用来测试它的上一个DOS命令的返回值的,注意只是上一个命令的返回值,而且返回值必须依照从大到小次序顺序判断。
因此下面的批处理文件是错误的:

@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:\
IF ERRORLEVEL 0 ECHO 成功拷贝文件
IF ERRORLEVEL 1 ECHO 未找到拷贝文件
IF ERRORLEVEL 2 ECHO 用户通过ctrl-c中止拷贝操作
IF ERRORLEVEL 3 ECHO 预置错误阻止文件拷贝操作
IF ERRORLEVEL 4 ECHO 拷贝过程中写盘错误

无论拷贝是否成功,后面的:
未找到拷贝文件
用户通过ctrl-c中止拷贝操作
预置错误阻止文件拷贝操作
拷贝过程中写盘错误
都将显示出来。

附录:
以下就是几个常用命令的返回值及其代表的意义:
backup
0 备份成功
1 未找到备份文件
2 文件共享冲突阻止备份完成
3 用户用ctrl-c中止备份
4 由于致命的错误使备份操作中止
diskcomp
0 盘比较相同
1 盘比较不同
2 用户通过ctrl-c中止比较操作
3 由于致命的错误使比较操作中止
4 预置错误中止比较
diskcopy
0 盘拷贝操作成功
1 非致命盘读/写错
2 用户通过ctrl-c结束拷贝操作
3 因致命的处理错误使盘拷贝中止
4 预置错误阻止拷贝操作
format
0 格式化成功
3 用户通过ctrl-c中止格式化处理
4 因致命的处理错误使格式化中止
5 在提示“proceed with format(y/n)?”下用户键入n结束
xcopy
0 成功拷贝文件
1 未找到拷贝文件
2 用户通过ctrl-c中止拷贝操作
4 预置错误阻止文件拷贝操作
5 拷贝过程中写盘错误

4、if还有一个特殊的用法就是可以用来检测某个变量是否已经被定义

用法示例:

@echo off 
set "str1=ok" 
set "str2=no" 
if defined str1 echo str1已经被定义 
if defined str2 echo str2已经被定义 
if defined str3 (echo str3已经被定义) else echo str3 没有被定义 
pause>nul 

待续....

更多精彩内容其他人还在看

XP下WORKSTATION启动慢导致系统启动时间过长问题的解决方法

通常安装过VMwareWorkstation导致系统启动过慢,经分析后,发现WORKSTATION服务启动时间较长,禁用后效果明显,可WORKSTATION是WINDOWS的共享基础服务,像我就离不开这个服务的,所以只需下面的脚本就可以解决问题了
收藏 0 赞 0 分享

IP动态切换bat脚本

因为公司办公室要设置固定IP才行,而家里的IP段和公司是不一样的,家里采用了DHCP机制,这样每次就得改IP设置,很是不方便,就写了这个脚本来动态切换,很流畅的说! WINXP,WIN7测试通过
收藏 0 赞 0 分享

奥汀管理员不切换bat脚本 V1.0-Design by Adobo

很多程序不能在管理员权限下运行,尤其是一些破解的程序。所以写了这个脚本,不影响正常的管理员,也不用切换到USERS账户~
收藏 0 赞 0 分享

cmd NTSD命令用法详解

ntsd 是一条dos命令,功能是用于结束一些常规下结束不了的死进程
收藏 0 赞 0 分享

win2003下杀任何进程的命令(taskkill,ntsd)

才能关掉一个用任务管理器关不了的进程?大多数人想到的都是专门工具,如IceSword。其实用Windows自带的工具就能杀大部分进程
收藏 0 赞 0 分享

Windows和 Linux下生成以当前时间命名文件的方法

在 Windows、Linux 操作系统,分别利用BAT批处理文件和Shell脚本,生成类似“20110228_082905.txt”以“年月日_时分秒”命名的文件
收藏 0 赞 0 分享

用批处理去掉快捷方式上的小箭头图案的代码

用批处理去掉快捷方式上的小箭头图案的代码,需要的朋友可以参考下。
收藏 0 赞 0 分享

xcopy 实现批处理拷贝文件或文件夹

xcopy 是一个很有用的doc命令,应该学习学习,XCOPY 还有众多的功能, 是加参数来完成的。上面的/s /e 参数的作用分别是把子目录和空目录都复制过去
收藏 0 赞 0 分享

安全工具netsh IPSec使用方法[ip安全策略]

IPSec的全称是Internet Protocol Security,翻译成中文就是Internet协议安全性。它的作用主要有两个:一个是保护 IP 数据包的内容,另外一点就是通过数据包筛选并实施受信任通讯来防御网络攻击
收藏 0 赞 0 分享

注册表危险组件删除功能批处理

用批处理实现的删除注册表危险组件的代码,主要应用于服务器,个人电脑不建议使用。
收藏 0 赞 0 分享
查看更多