二、常用进阶命令
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:test1.
d:test2.
d:test3.
效果就是显示 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:test1a
D:test1b
D:test1c
D:test2a
D:test2b
D:test2c
D:test3a
D:test3b
D:test3c
原来,它的含义是:列举 d:test 及其所有的子目录,对所有的目录路径都分别添加a、b、c之后再显示出来。
@echo off
for /r d:test %%i in (*.txt) doecho %%i
pause
运行结果是:
D:testtest.txt
D:test11.txt
D:test12.txt
D:test2a.txt
D:test2b.txt
D:test31.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之间能取到一个有效的数组序列。