Dos 命令进阶---批处理(中)
Dos 命令进阶---批处理(中)
变量, set命令, IF命令的讲解思路
变量
1. 在windows操作系统中,变量可分为两种:
一种是系统已经定义好的变量,叫做“系统变量”;
一种就是用户自己定义的变量。也叫做“自定义变量”。
系统变量如下图:
使用 set 命令获取系统中的环境变量列表
注:可以通过在CMD下输入“set”命令就可以看见系统中变量
那么我们如何获取单个系统变量的值呢,可以通过在CMD下输入
echo %windir% 就可以打印系统变量对应的值
获取系统环境变量所对应的值
举例说明:
copy copy c:cdir.txt %windir%
环境变更的应用
%WINDIR% 是一个系统变量(不区分大小写),表示的值可通过上面介绍的方法来查看
如: copy c:IPList.txt "%USERPROFILE%「开始」菜单程序Startup"
注意: 如果路径中带有空格, 这个""符号(上节讲的定界符)最好不要省哦。
2. 以上系统变量只是返回一些具体的值, 还有一些系统变量,它们是代表一个意思,或者一个操作
分别是%0 %1 %2 %3 %4 %5....到%9,还有一个%*
我们先来说一下%1-%9的意思(上节也有提到过, 在变量里再叙一遍, 一起复习一下)。
%1 返回批处理的第一个参数
%2 返回批处理的第二个参数
%3-%9 同样如此
什么是返回批处理参数呢?我们先来看个例子来理解一下
第九个实例.bat 的代码:
@echo off
echo %1 %2 %3 %4 %5 %6
echo %1
echo %2
echo %3
echo %4
echo %5
echo %6
打开CMD,输入"第九个实例.bat 条 友 们 万 岁 !"
注意中间的空格,主要是用来区分各个参数的
系统变量%1-%9的应用
那么这里还有一个%*,它的作用是返回所有参数的值.
例子:
@echo off
echo %*
打开CMD,输入"第九个实例.bat 条 友 们 万 岁 !"
%* 可以匹配所有外部参数
再唠叨一下: 注意参数之间的空格,主要是用来区分各个参数的
再来讲一下 %0 这个参数,它有两个意思
第一个意思,用%0可以返回批处理脚本文件本身所在的绝对路径
例子:
@echo off
echo %0
pause
说白了就是把批处理所在的路径给打印出来了
%0 这个系统变量的使用方法
第二个意思就是用它来无限循环执行批处理程序
例子:
@echo off
echo 广大条友们万岁!万万岁!!!
%0
这样的话,它就会无限循环的执行批处理程序(无限调用自身)
无限循环
3. 我们现在来说说自定义变量的实用性
如果要自定义一个批处理变量,那么我们就要用到系统中的一个set命令,
请使用"set /?" 看一下它的帮助文档
例子代码:
@echo off
set var=感谢条友们的关注支持, 条友们万万岁!
echo %var%
pause
这样系统就会将我们自定义变量的值给输出了,即字符串“感谢条友们的关注支持, 条友们万万岁!”
自定义变量的定义方式
我们还可以让用户自己给它赋予任意一个值
这时就会用到set /p这个参数了
例子代码:
@echo off
set /p var=请给变量赋个值:
::打印出用户输入的数据
echo %var%
pause
提示用户输入信息
打印输出用户输入的信息
这样的话,我们就可以使用批处理程序与用户进行交互。这个变量的值也就是用户自己任意输入的。系统只是将它所对应的值给输出了而已
Set命令详解
一. 回顾上面提到过的set命令的使用(重复的实例就不再重复截图浪费大家流量了)
(1)代码例子:
@echo off
set var=感谢条友们的关注支持, 条友们万万岁!
echo %var%
pause
这个例子中var这个变量我们已经定义好了并且给它赋了一个初值就是“感谢条友们的关注支持, 条友们万万岁!”, 那么这也是它最简单的用法。这个我相信大家都已经明白了.
(2)代码例子:
@echo off
set /p var=请给变量赋个值:
echo %var%
pause
向上滑两下就能看到刚讲过, 跟着操作一遍的条友肯定已经搞明白了, 还不懂的请私信我或留言.
二. 我们现在来学习下 set /a 这个参数的使用
首先说明下,这个/a参数主要是用来进行数学运算的。
就好比是1+1=2,4-2=2,2*2=4,6/3=2
很简单吧,先列下参数/a有那些运算符
(这些是Set命令帮助中内容, 可以通过CMD窗口执行 "set /?" 获取)
() - 分组
! ~ - - 一元运算符
* / % - 算数运算符
+ - - 算数运算符
<< >> - 逻辑移位
& - 按位“与”
^ - 按位“异”
| - 按位“或”
= *= /= %= += -= - 赋值
&= ^= |= <<= >>= - 表达式分隔符
这么多的运算符, 都需要在 /a 参数下才能发挥作用
看几个例子来理解一下 set /a 这个参数的使用:
set /a var=1+1 当你需要获取1+1这个表达式的结果时, 就必须使用 /a 这个参数, 否则返回就是 "1+1"
无 /a 参数set命令的不运算 = 号右边的算术表达式
使用了 /a 参数后进行前后对比看看
set /a var=4-2
set /a var=2*2
set /a var=6/3
set /a var=(1+1)+(1+1)
set /a a=1+1,b=1+2,c=1+3 还可以多个变量同时定义
多变量同时定义的操作
好,再来看看在原变量上进行加减乘除的操作
set /a var+=1
这是一种简写方法,其原形原形就是
set /a var=%var%+1
+= 运算符的使用, 其它组合运算符作用类似
那么加减乘除同样是如此,这些就不用小编啰嗦了吧, 如果真的还有条友不理解, 请私信我, 定回复.
还有一些“与”,“或”,“异或”运算符,跟学校学过的C语言运算符一样,同样先看几个例子
set /a var= 1 "|" 1 注意这里对运算符使用了 "" 定界符号, 或运算, 一真则真
1 或 1 的运算
1 或 0 , 0 或 1 的运算
0 或 0的运算
set /a var= 1 "^" 1 异或运算, 同为假, 异为真
异或运算 1 ^ 1
异或运算 1 ^ 0 或 0 ^ 1
异或运算 0 ^ 0
set /a var= 1 "&" 1 与运算, 一假则假
与运算 1 & 1
与运算 1&0 或 0&1
与运算 0&0
与, 或, 异或 这些运算符在使用时如果不使用 "" 定界符包括, 就会报错, 看演示:
逻辑运算符不加定界符 "" 会报异常
基础运算的加减乘除则不会, 但建议统一对所有运算符使用定界符
set /a var= 1 "+" 1
set /a var= 1 "%" 1 模运算, 即取余运算, 只返回运算的余数, 整除的返回0
set /a var= 2 "<<" 2
位运算之左移操作
set /a var= 4 ">>" 2
位运算之右移操作
学过二进制的条友可以看出, 与, 或, 非, 异或, 位运算等都是在二进制上操作的, 即运算前先将操作数都转换为二进制, 再进行, 与, 或, 非, 异或, 位移等运算. 建议有时间多玩玩, 再百度一下二进制, 几个小时就搞懂了.
注意再注意: 通过演练可以看到有的运算符号可以不用 "" 这个定界符, 有的必须用, 那么就统一起来, 所有运算符使用中都使用 "" 包括起来, 以避免不必要的异常.
三、环境变量替换增强用法
(1)%PATH:str1=str2%
会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1".
要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
示例(1):
@echo off
set var=感谢条友们的关注支持, 条友们万万岁!
echo 原样输出:“%var%”
set var=%var:条友=朋友%
echo 修改后的:“%var%”
pause
就是一个字符串替换操作
示例(2):
@echo off
set var=www.safer.com.cn
echo 原样输出:“%var%”
set var=%var:.=替换的字符%
echo 修改后的:“%var%”
pause
字符替换操作
只要是认真看了图解的, 比着葫芦画个瓢之后, 肯定也能理解了吧, 不懂就问, 或留言大家讨论 或私信我.
大家不要被 "环境变量替换增强" 这个标题给整蒙圈了, 看实例, 操作一下就懂了.
(2)%PATH:~10,5%
例1:
@echo off
set var=www.baidu.com
set var=%var:~1,3%
echo %var%
pause
从指定位置开始截取指定长度的字符串
首先说明下,这是一种截取字符串的用法。用上例中我们可以看出要截取的字符是从第一个字符开始,然后截取它后面的三个字符。请看图理解一下, 最好敲一下.
好,再来看看下面的这种用法
%PATH:~-10%
例2:
@echo off
set var=www.safer.com.cn
set var=%var:~-5%
echo %var%
pause
截取字符串最后几位字符
它就是截取变量var值的最后五位,看下结果就知道了。那么改成正数也是一样的
还可以这样子%PATH:~0,-2%
例3:
@echo off
set var=www.safer.com.cn
set var=%var:~0,-5%
echo %var%
pause
截取 从正向指定位置到反向指定位置 长度的字符串
解释下这种截取的方法,它就是从0开始一直到最后的五个字符之前的位置,看文字太枯燥, 建议有兴趣的条友实际操作一下.
例4:
@echo off
set var=www.safer.com.cn
set var=%var:~3,-5%
echo %var%
pause
截取 从正向指定位置到反向指定位置 长度的字符串
IF命令详解
一、if的三种用法(可通过"IF /?"命令获取帮助文档)
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 关键字之后执行该命令。
(1)、IF [NOT] ERRORLEVEL number do something 如果返回码是什么, 就做某事儿
ERRORLEVEL number 是错误码也称返回码。(只是这么个理解,但它与错误没有必然联系。)
如果最后运行的程序返回一个错误码(返回码),或它等于或大于指定数字number,则指定条件为 true。
示例代码1:
@echo off
ipconfig
if errorlevel 1 goto a
if errorlevel 0 goto b
:a
echo 结果为 ipconfig 执行失败!
pause
exit
:b
echo 结果为 ipconfig 正确执行!
pause
单分支判断语句操作实例
说明:“ipconfig”执行成功,则返回码为0
这是关于errorlevel的返回码的操作演示
(2)、IF [NOT] string1==string2 do something 如果字符串相等或不等, 就做某事儿
如果与指定的文字字符串匹配,指定条件为 true。
示例代码2:
@echo off
if "abcd" =="abcd" echo 我们相等!
pause
字符串比较判断
当然,也可以用于字符串变量的比较,如下:
@echo off
set str1=abcd
set str2=abcd
if %str1% == %str2% echo 我们相等!
pause
字符串比较判断
这里去掉两个变量的值,在加个/p来理解这个参数的作用吧!
set /p 这个参数的作用, 相必大家还没忘, 如果忘了, 就滑到上面再看看, 就是用于脚本与用户交互的.
@echo off
set /p str1=请输入第一个值:
set /p str2=请输入第二个值:
if %str1% == %str2% (echo 你输入的两个值是相等的!) else echo 你输入的两个值不相等!
pause
输入相等的值
输入不相等的值
(3)、IF [NOT] EXIST filename do something 如果某个文件存在, 就做某事儿
如果指定的文件名存在,指定条件为 true。
例:
@echo off
if not exist mstsc.exe echo 当前目录下存在文件mstsc.exe
pause
如果存在或不存在某个文件时
说明:如果当前文件夹下存在mstsc.exe则打印“当前目录下存在文件mstsc.exe”,否则不显示。
以上各句中的[NOT]是可选项,表示只有条件为 false 的情况下,才应该执行该命令。
二、if...else...语句
ELSE 子句必须在 IF 之后且必须出现在同一行上(重点)。
示例1:
@echo off
IF EXIST a.txt (del a.txt) ELSE echo 不存在文件!
pause
分支判断的使用
说明:如果存在文件 a.txt 则删除,否则显示 “不存在文件!”。
本程序段的这种写法是ELSE 子句在 IF 之后出现在同一行上的特殊形式,它是通过括号“(”和“)”相连接的。
下面说明几种错误理解的用法
由于 ELSE 命令必须与 IF 命令的尾端在同一行上,以下子句 不会 有效:
IF EXIST a.txt del a.txt
ELSE echo a.txt 不存在文件!
因为 del 命令需要用一个新行终止,以下子句 不会 有效:
IF EXIST a.txt del a.txt ELSE echo 不存在文件!
需要用括号扩上(重点)。
IF EXIST a.txt (del a.txt) ELSE echo 不存在文件!
三、IF 的嵌套用法
示例1:
@echo off
set /p var=请输入一个数字:
if %var% gtr 5 if %var% lss 10 echo 这是一个大于5小于10的数!
pause
双重判断的操作
说明:首先要注意“%var%”,若要取出变量的值要用%%将变量括起来。其次运算符gtr代表大于,lss代表小于,类似的运算符还有(不区分大小写, 如上图示):
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR- 大于
GEQ- 大于或等于
综合实例:
@echo off
:again
s=
cls
color f
set /p p=please input password:
set s=abcd
if"%p%"=="%s%" (
echo 密码输入正确, 即将为你打开新的CMD窗口! & start cmd.exe) else (echo 密码错误!)
pause >nul 进入暂停状态,但不显示暂停提示字符.
goto again
密码输入正确时
密码输入错误时