1.IF的第一种用法,比较字符串
if/?(2019.04.27)
执行批处理程序中的条件处理。
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 关键字之后执行该命令。
ELSE 子句必须出现在同一行上的 IF 之后。例如:
IF EXIST filename. (
del filename.
) ELSE (
echo filename. missing.
)
例:
set /p PW=请输入密码:
if %PW%==bat (
echo YES!
) ELSE (
Rem [else] 为可选参数,表示否则,即如果变量PW等于bat则输出YES!否则输出NO!
echo NO!
)
pause>nul
通过set /p和if可以实现一个简单的密码判断,当然这个密码判断可以很轻易地被破解,仔细动脑筋想一想,该怎么破解呢.
不过这个密码判断尚有不足之处,假如我们什么都不输入直接回车,便会提示错误,那该怎么办呢?很简单,只要加上双引号(其它的符号也行)就行了=>if “%PW%”==“bat”
2.IF的第二种用法,比较数字
例:
set /p num1=请第一个输入数字:
set /p num2=请第二个输入数字:
if not %num1% LSS %num2% (
rem lss表示小于
rem [not]为可选参数,表示非,即如果变量num1不小于变量num2就输出第一个数字大,否则输出第二个数字大
echo 第一个数字大
) ELSE (
echo 第二个数字大
)
pause>nul
这段代码可以实现一个简单的判断,不过尚有不足之处-----如果这两个数字相等呢,这就要请出我们的else if啦(当然你也可以用几个if来判断)
set /p num1=请第一个输入数字:
set /p num2=请第二个输入数字:
if "%num1%" gtr "%num2%" (
echo 第一个数字大
) ELSE if "%num1%" EQU "%num2%" (
echo 一样大
) ELSE (
echo 第二个数字大
)
pause>nul
------比较运算符-----
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
3.IF的第三种用法,检测文件(夹)是否存在
例:
@echo off
if exist C:\windows (
echo 你的C盘有windows文件(夹^)
) else (
echo 你的C盘没有windows文件(夹^)
)
pause>nul
"^"为转义符号,在特殊符号一节再作讲解
4.IF的第四种用法,检测变量是否被定义
例:
@echo off
set var=aiwozhonghua
if defined var (
echo 变量var已被定义,它的值为%var%
) else (
echo 变量var没有被定义
)
pause>nul
去掉第一行的set看看执行结果有什么不同,你明白它的用法了吗?
5.IF的第五种用法,判断返回值(ERRORLEVEL)
要判断返回值,首先要理解返回值是个什么概念,批处理中的返回值一般表示了上个命令的执行结果(成功/失败/等)
每个命令执行完毕后返回值都会做相应的更改,一般返回值为0表示成功,1表示失败,有一些第三方的返回值比较特殊(如Choice.exe,Tmos.exe,Cmos.exe),在这里就不讲解了
例:
@echo off
echo;>>%systemroot%\test.txt
if errorlevel 0 ( echo 写入成功! ) else echo 写入失败
pause>nul
这段代码尝试向%systemroot%\system32\写入数据,如果权限不够或杀毒软件拦截就会写入失败,这时就会显示"写入失败".不知道%systemroot%表示了什么?单独键入set自己仔细看一下结果.
不过看到后面你会发现这段代码还有更简便的写法
注:用 if errorlevel判断返回值时要将返回值从大到小排列
例:
@echo off
choice /C:ABC /n "A/B/C"
if errorlevel 3 echo You choose the C
if errorlevel 2 echo You choose the B
if errorlevel 1 echo You choose the A
pause>nul
GOTO
将 cmd.exe 导向到批处理程序中带标签的行。
GOTO label
label 指定批处理程序中用作标签的文字字符串。
标签必须单独一行,并且以冒号打头。
如果命令扩展名被启用,GOTO 会如下改变:
GOTO 命令现在接受目标标签 :EOF,这个标签将控制转移到当前
批脚本文件的结尾。不定义就退出批脚本文件,这是一个容易的
办法。有关能使该功能有用的 CALL 命令的扩展名描述,请键入
CALL /?。
label是什么?这可不是命令label,它指的是标签,标签是啥?见例子
例:
@echo off
set /p pw=请输入密码:
if "%pw%"=="bathome" goto yes
goto :eof
rem 未定义的:eof会退出脚本文件
:yes
echo 密码正确!
pause>nul
这是一个更加完整的密码判断,仔细阅读并执行这行代码,现在你知道标签是什么了吗,没错,那个:yes就是标签了!
标签的格式
:标签名
关掉回显以后你有没有发现什么?没错,标签所在的那一行没有被执行,这就是为什么::比rem更快的原因了,但是标签不能被使用在一个语句的内部,主要就是被括号括起来的语句(是的,被括号括起来的语句被看作一个整体),因此::的兼容性没有rem那么好
附:"::"其实就是不规范的标签名…
参考:https://baike.baidu.com/item/bat/365230?fr=aladdin