题外话:又到了周三晚上,2019年下半年的学习目标一也已经告一段落,就把最近学习总结的批处理发出来了,一则是方便以后自己翻阅,二则也可以分享给那些想学习批处理的朋友。
什么是批处理
批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD。这些命令统称批处理命令。
接下来我将分成 常用基础命令 和 常用进阶命令 两部分进行讲解:
一、常用基础命令
1、echo 和 @
1、echo是回显的意思,就是你的代码命令是否要显示在控制台上面,如果关闭回显,那么只会显示运行结果,不会显示运行的代码
语法:echo [{ on|off }]
2、@字符放在命令前将关闭该命令回显,无论此时echo是否为打开状态。常用写法:@echo off即关闭本条回显,以及后面的所有回显
3、echo 作为输出提示信息关键字,类似print,debug.log等等。
语法:echo 信息内容
比如:echo hello bat
4、关闭DOS命令提示符
在DOS提示符状态下键入echo off,能够关闭DOS提示符的显示使屏幕只留下光标,直至键入echo ON,提示符才会重新出现。
5、输出空行,即相当于输入一个回车
语法:echo.(echo后面没有空格,直接跟着点.)
2、REM 和 ::
这两个关键字都是起到注释本行命令的作用。REM为注释命令,一般用来给程序加上注解,该命令后的内容不被执行,但能回显(可以被@echo off关闭)。与rem 不同的是, ::后的字符行在执行时不会回显, 无论是否用echo on是否打开(可以用于标注代码)
Tips:上面两个关键字都只能实现单行注释,想实现多行注释,可以使用goto语句小技巧来实现:
goto start
::正中间的内容是注释内容,原理就是goto语句跳过了这里面的命名执行下面了
:start
3、PAUSE
用来暂停指令的执行,同时又不立刻关闭窗口,这样你就可以看到你指令执行的结果了。
Tips:1、可以在键盘上按下Ctrl+C组合键来强行终止一个批处理的执行过程。
2、要显示其他提示语,可以这样用:echo 其他提示语& pause > nul
4、set
语法形式:
SET [variable=[string]]
SET /Pvariable=[promptString]
SET /A expression
(1)定义变量
set var=10 ::=号两边不能有空格
set var=::给变量赋值是定义变量,不给变量赋值类似于注销变量
(2)SET /A expression
/A 让SET可以支持数学符号进行加减等一些数学运算,该表达式解析很简单并以递减的优先顺序支持下列操作:
() - 分组
! ~ - - 一元运算符
* / % - 算数运算符
+ - - 算数运算符
<< >> - 逻辑移位
& - 按位“与”
^ - 按位“异”
| - 按位“或”
= *= /= %= += -= &= ^= |=
<<= >>= - 赋值
, - 表达式分隔符
测试指令如下:
@echo off Setlocalenabledelayedexpansion
set a=100
set b=1000
set /a c=a+b
echo the result is :%c%
set /a a=1+1,b=2+1,c=3+1
echo %a% %b% %c%
set /a var= 1
"&" 1 ::逻辑或区域操作等运算符,需要用双引号引起来
set /a var= 1 "%" 1
set /a var= 2"<<" 2
set /a var= 4">>" 2
pause
(3)SET /P variable=[promptString]
功能等待用户输入
windows 2000 和windows 是没有choice这个命令,choice的等待用户输入功能就要通过set /p来实现
测试指令如下:
@echo off
Setlocal enabledelayedexpansion
set /p str=请输入你想输入的字符:
echo 你输入的字符串为:%str%
pause
(4)结合字符串操作,对变量的内容进行剪切、替换等操作
@echo off
Setlocal enabledelayedexpansion
set str=welcome come to bat
set var=%str:~3,4%
echo %var%
pause
(5)显示环境变量
如:
set 会显示当前所有的系统环境变量
set c 会显示当前所有的以c开头或C开头的变量(不区分大小写)
5、ERRORLEVEL
程序返回码
echo %errorlevel%
每个命令运行结束,可以用这个命令行格式查看返回码,用于判断刚才的命令是否执行成功.
默认值为0,命令执行成功则返回0,执行出错会设 errorlevel 为1
6、title
设置cmd窗口的标题
title 新标题 #可以看到cmd窗口的标题栏变了
7、COLOR
设置默认的控制台前景和背景颜色。
COLOR [attr] attr 指定控制台输出的颜色属性
颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为前景。每个数字可以为以下任何值之一:
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色 //不区分大小写
3 = 湖蓝色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
例如:COLOR FC
如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时的颜色。这个值来自当前控制台窗口、/T 开关或DefaultColor 注册表值。如果用相同的前景和背景颜色来执行 COLOR 命令,COLOR 命令会将 ERRORLEVEL 设置为 1。
8、goto 和 :
在批处理中允许以“:XXX”来构建一个标号,然后用goto XXX跳转到标号:XXX处,然后执行标号后的命令。
例:
if {%1}=={} goto noparms
if "%2"=="" goto noparms
标签的名字可以随便起,但是最好是有意义的字符串啦,前加个冒号用来表示这个字符串是标签,goto命令就是根据这个冒号(:)来寻找下一步跳到到那里。
@echo off
Setlocal enabledelayedexpansion
:start
set /p var=请输入一个大于3的数字
echo %var%
if %var% leq 3 goto start
pause
9、find
在文件中搜索字符串。
FIND [/V] [/C] [/N] [/I] [/off[LINE]] "string"
[[drive:][path]filename[ ...]]
/V 显示所有未包含指定字符串的行。
/C 仅显示包含字符串的行数。
/N 显示行号。
/I 搜索字符串时忽略大小写。
/off[LINE] 不要跳过具有脱机属性集的文件。
"string" 指定要搜索的文字串,
[drive:][path]filename 指定要搜索的文件。
如果没有指定路径,FIND 将搜索键入的或者由另一命令产生的文字。
Find常和type命令结合使用
Type [drive:][path]filename | find "string" [>tmpfile] #挑选包含string的行
Type [drive:][path]filename | find /v "string" #剔除文件中包含string的行
Type [drive:][path]filename | find /c #显示文件行数
10、start 命令
Start会开启新窗口来运行程序,如果新窗口不正常退出,你的批处理就不能正常执行下去
语法:start ["title"] [/dPath]
[/i] [/min] [/max] [{/separate | /shared}] [{/low | /normal | /high | /realtime
| /abovenormal | belownormal}] [/wait] [/b] [FileName] [parameters]
"title" 指定在“命令提示符”窗口标题栏中显示的标题。
/dpatch 指定启动目录。
/i 将 Cmd.exe 启动环境传送到新的“命令提示符”窗口。
/min 启动新的最小化窗口。
/max 启动新的最大化窗口。
/separate 在单独的内存空间启动 16 位程序。
/shared 在共享的内存空间启动 16 位程序。
/low 以空闲优先级启动应用程序。
/normal 以一般优先级启动应用程序。
/high 以高优先级启动应用程序。
/realtime 以实时优先级启动应用程序。
/abovenormal 以超出常规优先级的方式启动应用程序。
/belownormal 以低出常规优先级的方式启动应用程序。
/wait 启动应用程序,并等待其结束。
二、常用进阶命令
1、字符串的操作
常用的字符操作有截取通过“:~来进行处理”,如果想把截取或者替换后的字符串赋值给另一个变量,直接使用set即可。(如果中文出现乱码,把文件编码改成ANSI)。常用的字符串操作有:1、截取字符串 2、替换字符串 3、字符串合并 4、扩充字符串。效果如下图:
2、if语句的使用
在cmd使用 if /? 打开if的系统帮助,可以看到基本语法有下面三种,需要注意的是if和else尽量保持在同一行上面。
测试代码如下:
3、for语句的使用
for语句的几种用法如下:
a、for语句的基本用法
b、for /f (delims、tokens、skip、eol、userbackq、变量延迟)
c、for /r (递归遍历)
d、for /d (遍历目录)
e、for /l (计数循环)
1、for语句的基本用法
for语句的基本要素:
1、for、in和do是for语句的关键字,它们三个缺一不可;
2、%%I是for语句中对形式变量的引用,就算它在do后的语句中没有参与语句的执行,也是必须出现的;
3、in之后,do之前的括号不能省略;
4、command1表示字符串或变量,command2表示字符串、变量或命令语句;
For语句的执行过程
1、for语句的形式变量I,可以换成26个字母中的任意一个,这些字母会区分大小写,也就是说,%%I和%%i会被认为不是同一个变量;形式变量I还可以换成其他的字符,但是,为了不与批处理中的%0~%9这10个形式变量发生冲突,请不要随意把%%I替换为%%0 ~%%9中的任意一个;
2、in和do之间的command1表示的字符串或变量可以是一个,也可以是多个,每一个字符串或变量,我们称之为一个元素,每个元素之间,用空格键、跳格键、逗号、分号或等号分隔;
3、for语句依次提取command1中的每一个元素,把它的值赋予形式变量I,带到do后的command2中参与命令的执行;并且每次只提取一个元 素,然后执行一次do后的命令语句,而无论这个元素是否被带到command2中参与了command2的运行;当执行完一次do后的语句之后,再提取 command1中的下一个元素,再执行一次command2,如此循环,直到command1中的所有元素都已经被提取完毕,该for语句才宣告执行结 束;
其中,第3点是最为关键的,它描述了for语句的执行过程,是for语句的精髓所在,大家一定要牢记这一条,才能深刻理解更为复杂的for流程。
2、文本解析显神威:for /f 用法详解
1、/f逐行读完文件内的文本内容
2、切分字符串的利器:delims=
test.txt内的中文文本,被,分隔看了。注意,有中文文本,保存为ANSI格式
3、定点提取:tokens=
tokens= 后面一般跟的是数字,如 tokens=2,也可以跟多个,但是每个数字之间用逗号分隔,如 tokens=3,5,8,它们的含义分别是:提取第2节字符串、提取第3、第5和第8节字符串。注意,这里所说的“节”,是由 delims= 这一开关划分的,它的内容并不是一成不变的。
4、跳过无关内容,直奔主题:skip=n
for /f 允许你跳过这些无用的行,直接从第N+1行开始处理,这个时候,就需要使用参数 skip=n,其中,n是一个正整数,表示要跳过的行数。
这段代码将跳过头两行内容,从第3行起显示test.txt中的信息。
5、忽略以指定字符打头的行:eol=
eol= 的准确含义是:忽略以指定字符打头的行
3、遍历文件夹:for /r
1、for /r 的作用及用法
按照帮助信息里文绉绉的说法,for /r 的作用是“递归”,我们换一个通俗一点的,叫“遍历文件夹”,它会遍历指定目录和子目录下的所有文件和文件夹。
更详细的解释就是:在下面的语句中,如果“元素集合”中只是一个点号,那么,这条语句的作用就是:列举“目录”及其之下的所有子目录,对这些文件夹都 执行“命令语句集合”中的命令语句。其作用与嵌套进 for /f 复合语句的 "dir /ad /b /s 路径" 功能类似。如果省略了“目录”,将在当前目录下执行前面描述的操作。
for /r 目录 %%i in (元素集合) do 命令语句集合
@echo off
for /r d:\test %%i in (.) doecho %%i
pause
执行的结果如下所示:
d:\test\.
d:\test\1\.
d:\test\2\.
d:\test\3\.
效果就是显示 d:\test 目录及其之下是所有子目录的路径,其效果与 dir /ad /b
/s d:\test 类似。若要说到两者的区别,可以归纳出3点:
1、for /r 列举出来的路径最后都带有斜杠和点号,而 dir 语句则没有,会对获取到的路径进行进一步加工产生影响;
2、for /r 不能列举带隐藏属性的目录,而 dir 语句则可以通过指定 /a 后面紧跟的参数来获取带指定属性的目录,更加灵活;
3、若要对获取到的路径进行进一步处理,则需要把 dir 语句放入 for /f 语句中进行分析,写成 for /f %%i in ('dir /ad /b /s')
do …… 的形式;由于 for /r 语句是边列举路径边进行处理,所以,在处理大量路径的时候,前期不会感到有停顿,而 for /f 语句则需要等到 dir /ad /b
/s 语句把所有路径都列举完之后,再读入内存进行处理,所以,在处理大量路径的时候,前期会感到有明显的停顿。
第2点差别很容易被大家忽视,导致用 for /r 列举路径的时候会造成遗漏;而第3点则会让大家有更直观的感受,很容易感觉到两者之间的差别。
要是“元素集合”不是点号呢?那又如何?
@echo off
for /r d:\test %%i in (a b c) doecho %%i
pause
运行的结果是:
D:\test\1\a
D:\test\1\b
D:\test\1\c
D:\test\2\a
D:\test\2\b
D:\test\2\c
D:\test\3\a
D:\test\3\b
D:\test\3\c
原来,它的含义是:列举 d:\test 及其所有的子目录,对所有的目录路径都分别添加a、b、c之后再显示出来。
@echo off
for /r d:\test %%i in (*.txt) doecho %%i
pause
运行结果是:
D:\test\test.txt
D:\test\1\1.txt
D:\test\1\2.txt
D:\test\2\a.txt
D:\test\2\b.txt
D:\test\3\1.txt
这段代码的含义是:列举 d:\test 及其所有子目录下的txt文本文件(以.txt结尾的文件夹不会被列出来)。
我们再回过头来归纳一下这个语句的作用:
for /r 目录 %%i in (元素集合) do 命令语句集合
上面语句的作用是:
1、列举“目录”及该目录路径下所有子目录,并把列举出来的目录路径和元素集合中的每一个元素拼接成形如“目录路径\元素”格式的新字符串,然后,对每一条这样的新字符串执行“命令语句集合”中的每一条命令;
特别的是:当“元素集合”带以点号分隔的通配符?或*的时候,把“元素集合”视为文件(不视为文件夹),整条语句的作用是匹配“目录”所指文件夹及其所有子文件夹下匹配的文件;若不以点号分隔,则把“元素集合”视为文件夹(不视为文件);
2、当省略掉“目录”时,则针对当前目录;
3、当元素集合中仅仅是一个点号的时候,将只列举目录路径;
4、计数循环:for /l
/l 者,/loop的缩写是也,从鸟语翻译过来,loop就是循环的意思。实际上,所有的for语句,都可以看成是一种“循环”,只是在/l中,特指按照指定次数进行循环罢了。
for /l 语句的完整格式是这样的:
for /l %%i in (x,y,z) do (……)
在这个语句中,x、y和z都只能取整数,正负皆可,x指代起始值,y指代步长,z为终止值,具体含义为:从x开始计数,以y为步长,直至最接近 z的那个整数值为止,这之间有多少个数,do后的语句就执行多少次。
在以上的代码中,初始值是1,步长为2,终止值为10,表明计数从1开始,每隔2个数计算一次,直至最接近10的那个整数,罗列出来,就是1,3,5,7,9,再下一个就是11,超过10了,不再计算在内,所以,do后的语句只执行5次,将连续显示5个bathome。
实际上,x,y和z的值可正可负,甚至为0,限制非常宽松:
1、步长y的值不能为0;
2、当步长y的值为正整数时,终止值z不能小于初始值x;
3、当步长y的值为负整数的时候,终止值z不能大于初始值x。
换而言之,必须保证in和do之间能取到一个有效的数组序列。