Dos 命令进阶---批处理(中)

Dos 命令进阶---批处理(中)


Dos 命令进阶(三)---批处理(中)

变量, set命令, IF命令的讲解思路



变量


1. 在windows操作系统中,变量可分为两种:

一种是系统已经定义好的变量,叫做“系统变量”;

一种就是用户自己定义的变量。也叫做“自定义变量”。


系统变量如下图:

Dos 命令进阶(三)---批处理(中)

使用 set 命令获取系统中的环境变量列表

注:可以通过在CMD下输入“set”命令就可以看见系统中变量

那么我们如何获取单个系统变量的值呢,可以通过在CMD下输入

echo %windir% 就可以打印系统变量对应的值

Dos 命令进阶(三)---批处理(中)

获取系统环境变量所对应的值

举例说明:

copy copy c:cdir.txt %windir%

Dos 命令进阶(三)---批处理(中)

环境变更的应用

%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 条 友 们 万 岁 !"

注意中间的空格,主要是用来区分各个参数的

Dos 命令进阶(三)---批处理(中)

系统变量%1-%9的应用

那么这里还有一个%*,它的作用是返回所有参数的值.

例子:

@echo off

echo %*

打开CMD,输入"第九个实例.bat 条 友 们 万 岁 !"

Dos 命令进阶(三)---批处理(中)

%* 可以匹配所有外部参数

再唠叨一下: 注意参数之间的空格,主要是用来区分各个参数的

再来讲一下 %0 这个参数,它有两个意思

一个意思,用%0可以返回批处理脚本文件本身所在的绝对路径

例子:

@echo off

echo %0

pause

说白了就是把批处理所在的路径给打印出来了

Dos 命令进阶(三)---批处理(中)

%0 这个系统变量的使用方法

个意思就是用它来无限循环执行批处理程序

例子:

@echo off

echo 广大条友们万岁!万万岁!!!

%0

这样的话,它就会无限循环的执行批处理程序(无限调用自身)

Dos 命令进阶(三)---批处理(中)

无限循环


3. 我们现在来说说自定义变量的实用性

如果要自定义一个批处理变量,那么我们就要用到系统中的一个set命令,

请使用"set /?" 看一下它的帮助文档

例子代码:

@echo off

set var=感谢条友们的关注支持, 条友们万万岁!

echo %var%

pause

这样系统就会将我们自定义变量的值给输出了,即字符串“感谢条友们的关注支持, 条友们万万岁!”

Dos 命令进阶(三)---批处理(中)

自定义变量的定义方式


我们还可以让用户自己给它赋予任意一个值

这时就会用到set /p这个参数了

例子代码:

@echo off

set /p var=请给变量赋个值:

::打印出用户输入的数据

echo %var%

pause

Dos 命令进阶(三)---批处理(中)

提示用户输入信息

Dos 命令进阶(三)---批处理(中)

打印输出用户输入的信息

这样的话,我们就可以使用批处理程序与用户进行交互。这个变量的值也就是用户自己任意输入的。系统只是将它所对应的值给输出了而已


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"

Dos 命令进阶(三)---批处理(中)

无 /a 参数set命令的不运算 = 号右边的算术表达式

Dos 命令进阶(三)---批处理(中)

使用了 /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 还可以多个变量同时定义

Dos 命令进阶(三)---批处理(中)

多变量同时定义的操作

好,再来看看在原变量上进行加减乘除的操作


set /a var+=1

这是一种简写方法,其原形原形就是

set /a var=%var%+1

Dos 命令进阶(三)---批处理(中)

+= 运算符的使用, 其它组合运算符作用类似

那么加减乘除同样是如此,这些就不用小编啰嗦了吧, 如果真的还有条友不理解, 请私信我, 定回复.

还有一些“与”,“或”,“异或”运算符,跟学校学过的C语言运算符一样,同样先看几个例子

set /a var= 1 "|" 1 注意这里对运算符使用了 "" 定界符号, 或运算, 一真则真

Dos 命令进阶(三)---批处理(中)

1 或 1 的运算

Dos 命令进阶(三)---批处理(中)

1 或 0 , 0 或 1 的运算

Dos 命令进阶(三)---批处理(中)

0 或 0的运算

set /a var= 1 "^" 1 异或运算, 同为假, 异为真

Dos 命令进阶(三)---批处理(中)

异或运算 1 ^ 1

Dos 命令进阶(三)---批处理(中)

异或运算 1 ^ 0 或 0 ^ 1

Dos 命令进阶(三)---批处理(中)

异或运算 0 ^ 0

set /a var= 1 "&" 1 与运算, 一假则假

Dos 命令进阶(三)---批处理(中)

与运算 1 & 1

Dos 命令进阶(三)---批处理(中)

与运算 1&0 或 0&1

Dos 命令进阶(三)---批处理(中)

与运算 0&0


与, 或, 异或 这些运算符在使用时如果不使用 "" 定界符包括, 就会报错, 看演示:

Dos 命令进阶(三)---批处理(中)

逻辑运算符不加定界符 "" 会报异常

Dos 命令进阶(三)---批处理(中)

基础运算的加减乘除则不会, 但建议统一对所有运算符使用定界符

set /a var= 1 "+" 1

set /a var= 1 "%" 1 模运算, 即取余运算, 只返回运算的余数, 整除的返回0

set /a var= 2 "<<" 2

Dos 命令进阶(三)---批处理(中)

位运算之左移操作

set /a var= 4 ">>" 2

Dos 命令进阶(三)---批处理(中)

位运算之右移操作

学过二进制的条友可以看出, 与, 或, 非, 异或, 位运算等都是在二进制上操作的, 即运算前先将操作数都转换为二进制, 再进行, 与, 或, 非, 异或, 位移等运算. 建议有时间多玩玩, 再百度一下二进制, 几个小时就搞懂了.

注意再注意: 通过演练可以看到有的运算符号可以不用 "" 这个定界符, 有的必须用, 那么就统一起来所有运算符使用中都使用 "" 包括起来, 以避免不必要的异常.


三、环境变量替换增强用法

(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

Dos 命令进阶(三)---批处理(中)

就是一个字符串替换操作


示例(2):

@echo off

set var=www.safer.com.cn

echo 原样输出:“%var%”

set var=%var:.=替换的字符%

echo 修改后的:“%var%”

pause

Dos 命令进阶(三)---批处理(中)

字符替换操作

只要是认真看了图解的, 比着葫芦画个瓢之后, 肯定也能理解了吧, 不懂就问, 或留言大家讨论 或私信我.

大家不要被 "环境变量替换增强" 这个标题给整蒙圈了, 看实例, 操作一下就懂了.


(2)%PATH:~10,5%

例1:

@echo off

set var=www.baidu.com

set var=%var:~1,3%

echo %var%

pause

Dos 命令进阶(三)---批处理(中)

从指定位置开始截取指定长度的字符串

首先说明下,这是一种截取字符串的用法。用上例中我们可以看出要截取的字符是从第一个字符开始,然后截取它后面的三个字符。请看图理解一下, 最好敲一下.


好,再来看看下面的这种用法

%PATH:~-10%

例2:

@echo off

set var=www.safer.com.cn

set var=%var:~-5%

echo %var%

pause

Dos 命令进阶(三)---批处理(中)

截取字符串最后几位字符

它就是截取变量var值的最后五位,看下结果就知道了。那么改成正数也是一样的


还可以这样子%PATH:~0,-2%

例3:

@echo off

set var=www.safer.com.cn

set var=%var:~0,-5%

echo %var%

pause

Dos 命令进阶(三)---批处理(中)

截取 从正向指定位置到反向指定位置 长度的字符串

解释下这种截取的方法,它就是从0开始一直到最后的五个字符之前的位置,看文字太枯燥, 建议有兴趣的条友实际操作一下.


例4:

@echo off

set var=www.safer.com.cn

set var=%var:~3,-5%

echo %var%

pause

Dos 命令进阶(三)---批处理(中)

截取 从正向指定位置到反向指定位置 长度的字符串


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

Dos 命令进阶(三)---批处理(中)

单分支判断语句操作实例

说明:“ipconfig”执行成功,则返回码为0

Dos 命令进阶(三)---批处理(中)

这是关于errorlevel的返回码的操作演示


(2)、IF [NOT] string1==string2 do something 如果字符串相等或不等, 就做某事儿

如果与指定的文字字符串匹配,指定条件为 true。

示例代码2:

@echo off

if "abcd" =="abcd" echo 我们相等!

pause

Dos 命令进阶(三)---批处理(中)

字符串比较判断

当然,也可以用于字符串变量的比较,如下:

@echo off

set str1=abcd

set str2=abcd

if %str1% == %str2% echo 我们相等!

pause

Dos 命令进阶(三)---批处理(中)

字符串比较判断

这里去掉两个变量的值,在加个/p来理解这个参数的作用吧!

set /p 这个参数的作用, 相必大家还没忘, 如果忘了, 就滑到上面再看看, 就是用于脚本与用户交互的.

@echo off

set /p str1=请输入第一个值:

set /p str2=请输入第二个值:

if %str1% == %str2% (echo 你输入的两个值是相等的!) else echo 你输入的两个值不相等!

pause

Dos 命令进阶(三)---批处理(中)

输入相等的值

Dos 命令进阶(三)---批处理(中)

输入不相等的值


(3)、IF [NOT] EXIST filename do something 如果某个文件存在, 就做某事儿

如果指定的文件名存在,指定条件为 true。

例:

@echo off

if not exist mstsc.exe echo 当前目录下存在文件mstsc.exe

pause

Dos 命令进阶(三)---批处理(中)

如果存在或不存在某个文件时

说明:如果当前文件夹下存在mstsc.exe则打印“当前目录下存在文件mstsc.exe”,否则不显示。

以上各句中的[NOT]是可选项,表示只有条件为 false 的情况下,才应该执行该命令。


二、if...else...语句

ELSE 子句必须在 IF 之后且必须出现在同一行上(重点)。

示例1:

@echo off

IF EXIST a.txt (del a.txt) ELSE echo 不存在文件!

pause

Dos 命令进阶(三)---批处理(中)

分支判断的使用

说明:如果存在文件 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

Dos 命令进阶(三)---批处理(中)

双重判断的操作

说明:首先要注意“%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

Dos 命令进阶(三)---批处理(中)

密码输入正确时

Dos 命令进阶(三)---批处理(中)

密码输入错误时