Bat 批处理脚本学习

Bat 脚本学习

常用内部命令

REM 和 ::

注释命令,注释后的命令不执行
用::作为注释时有两点需要注意

  1. : + 字母/数字 时会成为标号,goto可以识别并跳转
  2. : + 特殊符号,goto无法识别,会变成注释作用
    而且::与REM也有些许不同,REM后的字符在执行时可以显示,::的不会显示。
    Rem和::

Echo 和 @

@放在命令前可以关闭命令的回显,无论echo的状态是否打开

  1. ECHO ON|OFF 控制回显的打开与否
  2. ECHO 查看当前状态
    ECHO on与off
  3. ECHO 打印的内容
    在前面演示REM时使用到的打印语句,可以输出想输出的信息
  4. ECHO空行,通过 ECHO. 输出,需要注意的是点与ECHO中间不能有空格,点可以用其他特殊符号代替,如 :;”/[]+
  5. ECHO 答复语|命令文件名
    上述格式可以用于简化一些需要人机对话的命令(如:CHKDSK/F;FORMAT Drive:;del .)的操作,它是通过DOS管道命令把ECHO命令输出的预置答复语作为人机对话命令的输入。
    生成临时文件
    答复语
    结果如图所示,YES将作为DEL的输入,同时DEL删除了临时文件tmp.txt
  6. ECHO info > fileName
    如5中我们生成临时文件所示,我们使用ECHO可以生成文件
    生成文件

PAUSE

暂停,如之前的使用一般,暂停批处理命令的执行,直达我们按下一个任意键

errorlevel

程序的返回码,命令运行结束后可以通过%errorlevel%拿到上一个命令执行结果的状态码
状态码
默认为0值,一般命令执行出错会设为1

GOTO和:

GOTO,跳转的意思,在多种语言中都有这种设定比如C语言,在批处理中允许以“:XXX”来构建一个标号,然后用GOTO XXX跳转到标号:XXX处,然后执行标号后的命令。
标签的名字可以随便起,但是最好是有意义的字符串,前加个冒号用来表示这个字符串是标签,goto命令就是根据这个冒号(:)来寻找下一步跳到到那里。

goto例子
其中LEQ表示小于等于的意思,我们通过GOTO实现了一个循环,循环判断var的值小于等于3时则跳转执行自增1的操作

关于运算符
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于

CALL

CALL命令可以在批处理执行过程中调用另一个批处理,当另一个批处理执行完后,再继续执行原来的批处理。CALL command 调用一条批处理命令,和直接执行命令效果一样,特殊情况下很有用。
调用的其它批处理程序。filename 参数必须具有 .bat 或 .cmd 扩展名。
CALL :label arguments 调用本文件内命令段,相当于子程序。被调用的命令段以标签:label开头,以命令goto :eof结尾。
CALL命令

SHIFT

shift的功能和linux下shell的shift功能相似,移动参数的位置。
使用方式:SHIFT [/n]
该命令行开关告诉命令从第 n 个参数开始移位;n 介于0和8之间。SHIFT /2会将 %3 移位到 %2,将 %4 移位到 %3,等等;同样的不会不影响 %0 和 %1。

START

批处理中调用外部程序的命令(该外部程序在新窗口中运行,批处理程序继续往下执行,不理会外部程序的运行状况),如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令。
START打开文件管理器
如图 使用START唤起了文件管理器打开了D盘文件夹

IF

  1. IF [NOT] ERRORLEVEL number command
    状态码IF
    状态码IF,一定是跟在一个命令之后,根据上一个命令的状态码控制要不要执行语句,值得注意的是,判断的状态码一定是从大到小
  2. IF [NOT] string1==string2 command
    string1和string2都为字符的数据,区分大小写,等于号必须是两个(绝对相等),条件相等后即执行后面的command
    字符串型IF
  3. IF [NOT] EXIST filename command
    文件存在IF
    判断文件或者目录是否存在,存在则执行后面的command
  4. IF [NOT] defined 变量名 Command
    判断变量是否存在定义,存在则执行Command,示例如下:
    If变量

SET

SET用于定义变量,在之前的示例中已经展示了部分SET的用法,这里还有一些,比如以下如图:
SET常规用法
以上是SET的常规用法
第一种,@SET 变量 可以显示变量是否有定义
第二种,SET 变量=值 值得注意的是如果想要打印后面的结果,等号两边不能有空格,这里笔者的使用是错误的,接下来的案例将修正这个错误
此外变量还可以进行拓展,有如下几种拓展方式:
变量的拓展

  1. 显示从第一位开始的五位数字
  2. 显示从第二位开始的五位数字
  3. 显示最后五位数字
  4. 从第六位开始,去掉最后两位的数字
  5. 将7890位置的数字换为54321

除此之外,变量的值可以撤销,如图所示:
值的撤销
还可以接受用户输入的值作为变量的值:
/p开关
/p为开关,表示接收用户输入的值,前面使用的/a是代表计算的开关,使用/p就可以读入键盘的输入,值得注意的是前面所提到的SET赋值时,等号的两边不能有空格,一旦出现空格,会导致ECHO+空格打印当前ECHO的状态。

SETLOCAL 延迟变量

延迟变量的存在是为了解决一些如下图一样的情况:
赋值异常-延迟变量
如图所示,a给了一个0值,将a的值改为1同时打印出来的时候,值并没有改变,还是0。这是因为,批处理在预处理的过程中,执行第三行的时候,给a赋值为0,所以a=1的命令并没有在这一行生效,而是在它的下一行才开始生效
下一行生效
为了解决这个问题,批处理设计了延迟变量用于感知环境变量的变化。
简单来说,在读取了一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说“延迟”了对变量的赋值。
开启延迟变量的方法如下所示:
开启延迟变量
如图所示开启了延迟变量之后,变量必须使用英文感叹号,两次打印的结果都是1。

常用特殊符号

@ 命令行回显屏蔽符

这个在之前已经有非常多的使用案例,效果就是屏蔽命令的回显,echo off可以关闭所有命令的回显,使用@echo off 这样可以屏蔽它自身的回显。

> 重定向符

这个字符的意思是传递并且覆盖,他所起的作用是将运行的结果传递到后面的范围
重定向示例
比如这样可以创建文件,不过值得注意的是,第三行的命令生成的txt文件hello后会有一个空格

>> 重定向符

与>重定向符有些类似,但是>>是在内容后面追加,而不清除
>>重定向

| 命令管道符

和在linux环境中的管道操作符基本一样,格式如下:
第一条命令 | 第二条命令 [| 第三条命令…]
将第一条命令的结果作为第二条命令的参数来使用
管道操作符

^转义字符 &组合命令

^是对特殊符号<,>,&的前导字符,在命令中他将以上3个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义。
而&为组合命令,顾名思义,就是可以把多个命令组合起来当一个命令来执行,这个符号允许在一行中使用2个以上不同的命令,当第一个命令执行失败了,也不影响后边的命令执行。
转义字符 组合命令
可以看到echo没有把hello写入到1.txt中,而是完整的打印了整句命令,且&也没用触发,第二个命令中前三个盘符不存在也不影响整条命令的执行。

组合命令还有其他的表现形式:
&& 连接的命令,前面的命令出错后,后面的命令不再执行;
|| 连接的命令,前面的命令出错后,才执行后面的命令!

; 与 ()

;和()
; 分号在命令相同目标不同时可以使用,将目标分隔开来,只要有一个路径不存在,后面的也不再执行,当做一个语句执行
而()可以将多个语句括住,这样括号内的内容会被当做一个语句执行,其中如果涉及变量需要注意变量延迟问题。

Bat 进阶

for

格式:FOR %%variable IN (set) DO command [command-parameters]
variable :指定一个参数
(set) : 一个或者一组文件,可以有通配符(*和?)
command :对每个文件执行命令
command-parameters :命令的参数或者开关

for 本身还有4个参数可以接收

  1. 参数/D
    FOR /D %%variable IN (set) DO command [command-parameters]
    如果(SET)中有通配符,有/D参数会匹配目录,而不是这个目录中的文件组,执行command
    /D参数
    这里我们使用 * 通配符,表示取当前根目录下的所有目录并且显示,根目录下有两个,所以只打引了两个(而不是其他文件组)
  2. 参数/R
    FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
    检查以 [drive:]path 为根的目录树,指向每个目录中的FOR 语句。如果在 /R 后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。
    /R参数
    这里写出了两种用法
    第一种:指定盘符路径,在指定的盘符路径下找出所有.exe后缀的文件(或者任意其他你想要的任何文件,找文件非常好用)
    第二种:不写盘符路径,会找出当前路径下满足.erl后缀的所有文件
  3. 参数/L
    FOR /L %%variable IN (start,step,end) DO command [command-parameters]
    /R参数
    生成start到end的序列,start每次以step进行迭代,超过end立即停止。可以使用负的step实现递减迭代。
  4. /F参数
    FOR /F [“options”] %%variable IN (file-set) DO command [command-parameters]
    FOR /F [“options”] %%variable IN (“string”) DO command [command-parameters]
    FOR /F [“options”] %%variable IN (‘command’) DO command [command-parameters]
    /F参数的三种形式,使用文件解析来处理命令输出字符串文件内容
    使用迭代变量定义要检查的内容或字符串,并使用各种options选项进一步修改解析方式。使用options令牌选项指定哪些令牌应该作为迭代变量传递。
    带引号的字符串"options"包括一个或多个
    指定不同解析选项的关键字。这些关键字为:
    eol=char - 指一个行注释字符的结尾(就一个)
    skip=n - 指在文件开始时忽略n行内容。
    delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。
    tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。m-n格式为一个范围。通过 nth 符号指定 mth。如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。经测试,该参数最多只能区分31个字段。
    usebackq - 使用后引号。未使用参数usebackq时:file-set表示文件,但不能含有空格。使用参数usebackq时:file-set和"file-set"都表示文件。
    只是看解释或许有些不清楚,接下来用案例说明:
    eol=
    eol=; 分号开头的行为注释行
    tokens=1,3* 将每行第1段,第3段和剩余字段分别赋予变量%%i,%%j,%%k
    delims=,- (减号后有一空格)以逗号减号和空格为分隔符,空格必须放在最后
    打印所有
    打印所有的内容,没有注释行,没有分隔行
    命令
    用单引号括住的命令输出的内容也可以作为迭代的输入使用。

系统变量

由系统将其根据事先定义的条件自动赋值,也就是这些变量系统已经给他们定义了值
系统变量1
系统变量2
系统变量3
系统变量4

变量嵌套 与 命令嵌套

编写一个简单的变量嵌套 命令嵌套,其功能从一堆变量中取出我们想要的变量并执行


截取功能统一语法格式为:%a:~[m[,n]]%


方括号表示可选,==%==为变量标识符,a为变量名,不可少冒号用于分隔变量名和说明部分,符号 简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)。
百分号如果需要当成 单一字符 ,必须写成%%
以上是dos变量处理的通用格式,如果其中的m、n为变量,那么这种情况就是变量嵌套了。

比如设变量word为“abcdefghij”,变量num为“123456789”

%word:~4,1%为e,其中4可以从变量num中取值,即%num:~3,1%,写成组合形式如下:
%word:~%num:~3,1%,1% 经测试这种写法不能正确执行,写成%word:~(%num:~3,1%),1%同样不行

实现这种变量嵌套就必须结合命令嵌套。
命令嵌套简单的说,首先用一条dos命令生成一个字符串,而这个字符串是另一条dos命令,用call语句调用字符串将其执行,从而得到最终结果。
示例如下:
变量嵌套 与 命令嵌套

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值