批处理dir 保存到变量中_批处理学习总结(二)

二、常用进阶命令

1、字符串的操作

常用的字符操作有截取通过“:~来进行处理”,如果想把截取或者替换后的字符串赋值给另一个变量,直接使用set即可。(如果中文出现乱码,把文件编码改成ANSI)。常用的字符串操作有:1、截取字符串 2、替换字符串 3、字符串合并 4、扩充字符串。效果如下图:

c1368e95978a7b7e32847cd79fd81127.png

2、if语句的使用

在cmd使用 if /? 打开if的系统帮助,可以看到基本语法有下面三种,需要注意的是if和else尽量保持在同一行上面。

d11ee93967e8874cbf904f30e9249f30.png

测试代码如下:

63ea864c83606abae8d02bae5fa9c787.png

3、for语句的使用

for语句的几种用法如下:

a、for语句的基本用法

b、for /f (delims、tokens、skip、eol、userbackq、变量延迟)

c、for /r (递归遍历)

d、for /d (遍历目录)

e、for /l (计数循环)

1、for语句的基本用法

770b1411e01d9a5028ba476e474382c7.png

for语句的基本要素:

1、for、in和do是for语句的关键字,它们三个缺一不可;

2、%%I是for语句中对形式变量的引用,就算它在do后的语句中没有参与语句的执行,也是必须出现的;

3、in之后,do之前的括号不能省略;

4、command1表示字符串或变量,command2表示字符串、变量或命令语句;

929656256aecbfce0b865499f511efed.png

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逐行读完文件内的文本内容

c81147c61e27e5aef4f1b4032636fefb.png

2、切分字符串的利器:delims=

test.txt内的中文文本,被,分隔看了。注意,有中文文本,保存为ANSI格式

2112c033b37d75358ebf408ec1873ec7.png

3、定点提取:tokens=

tokens= 后面一般跟的是数字,如 tokens=2,也可以跟多个,但是每个数字之间用逗号分隔,如 tokens=3,5,8,它们的含义分别是:提取第2节字符串、提取第3、第5和第8节字符串。注意,这里所说的“节”,是由 delims= 这一开关划分的,它的内容并不是一成不变的。

f0c884b8493844a1733f619675430b56.png

4、跳过无关内容,直奔主题:skip=n

for /f 允许你跳过这些无用的行,直接从第N+1行开始处理,这个时候,就需要使用参数 skip=n,其中,n是一个正整数,表示要跳过的行数。

417a1dceed200b3ad5566c4423ddb4ed.png

这段代码将跳过头两行内容,从第3行起显示test.txt中的信息。

5、忽略以指定字符打头的行:eol=

eol= 的准确含义是:忽略以指定字符打头的行

34738c96ef2528a57b26c04f2ea368e0.png

3、遍历文件夹:for /r

1、for /r 的作用及用法

按照帮助信息里文绉绉的说法,for /r 的作用是“递归”,我们换一个通俗一点的,叫“遍历文件夹”,它会遍历指定目录和子目录下的所有文件和文件夹。

更详细的解释就是:在下面的语句中,如果“元素集合”中只是一个点号,那么,这条语句的作用就是:列举“目录”及其之下的所有子目录,对这些文件夹都 执行“命令语句集合”中的命令语句。其作用与嵌套进 for /f 复合语句的 "dir /ad /b /s 路径" 功能类似。如果省略了“目录”,将在当前目录下执行前面描述的操作。

for /r 目录 %%i in (元素集合) do 命令语句集合

9b1d629bfb3b562f78a04dbbd0305def.png

@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后的语句就执行多少次。

04051ee6e433a5a08d204d406a480e91.png

在以上的代码中,初始值是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之间能取到一个有效的数组序列。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值