文章目录
常规模式
程序之所以能替代人,就是因为它可以不眠不休地进行重复性操作,批处理指令自然也提供了循环工作的逻辑,此即for循环。
批处理中的For循环,其基本格式为for %%i in (...) do ...
,括号中是将要遍历的内容,%%i是每次循环取出来的值,do后面是执行的操作。
需要注意,和其他批处理指令不同,在for循环中,变量名是区分大小写的。而且在命令行中直接使用for循环,迭代变量i前面只需要一个百分号,而批处理文件中则需要两个,后文在命令行演示时均写一个百分号,而介绍命令格式时,则默认批处理文件的格式。
js
>for %i in (a b c) do @echo %i
a
b
c
括号中除了可以是一一列举出来的字符串之外,还可以是带有通配符的文件列表,例如下面的代码表示遍历C盘所有符合*.*这个格式的路径,其实就是文件,并输出到命令行
js
>for %i in (c:\*.*) do @echo %i
c:\appverifUI.dll
c:\DumpStack.log
c:\vfcompat.dll
如果括号里的内容是c:\*.dll
,那么就不会输出那个.log文件了。
L模式
除了直接调用外,批处理的For循环还有4种模式,即DRLF,其中L模式用于循环数字,这个也是我们最熟悉的for循环,示例如下
js
>@ for /L %v in (0, 1, 5) do @echo %v
0
1
2
3
4
5
其基本格式是for /L %v in (start, step, end) do ()
,其中start和end是数组的起点和终点,step为其步长。(0,1,5)表示从0到5,步长为1的等差数列。
D模式
D可以理解为directory,即文件夹模式,当其循环体中包含通配符的时候,将不进行文件匹配,而是执行文件夹匹配,同样是C盘的匹配代码,其运行结果如下,但若不加/D,是没办法匹配到这些文件夹的。
js
>for /D %i in (c:\*s) do @echo %i
c:\PerfLogs
c:\Program Files
c:\Users
c:\Windows
R模式
对于熟悉命令行的同学来说,r很自然就会联想到递归,也就是说,在r模式下遍历文件夹,会获取包括其子文件夹在内的所有文件。下面用r模式的for循环在Code文件夹中搜索所有的c语言文件,结果如下,非常直观地看到,其结果返回了不同文件夹中的c语言文件。
js
D:\Code>for /r %i in (*.c) do @echo %i
D:\Code\PL\calc\lex.c
D:\Code\src\c\ADT.c
D:\Code\src\c\bmp.c
D:\Code\src\c\bTree.c
D:\Code\src\cImg\graph.c
D:\Code\src\cImg\test.c
D:\Code\src\cMatrix\mat.c
D:\Code\src\cMatrix\sdt.c
r模式支持在指定文件夹中搜索,例如上面在D:\Code路径下执行的遍历操作,那么下面在D盘根目录中执行的操作,由于指定了Code文件夹,所以结果和上面是相同的。
js
D:\>for /r Code %i in (*.c) do @echo %i
F模式
F即File,可以理解为文件模式,下面新建一个文件test.txt,内容如下
nobody knows the little rose
it might a pilgrim be
did i not take it from ways
and lift it up to thee
然后用F模式下的for循环,结果如下
js
>for /f %i in (test.txt) do @echo %i
nobody
it
did
and
即在没有参数的情况下,F模式会按行读取文本,但每一行遇到空格就会终止。F模式也支持读取多个文件,只需用括号将多个文件括起来,甚至可以读取两个相同的文件,想下面这样
bat
>for /f %i in (test.txt, test.txt) do @echo %i
F模式的For循环也可以接参数,参数列表如下
eol=c | 忽略c开头的行 |
skip=n | 文件开始时忽略的行数 |
delims=xxx | 分隔符集,可以取代空格 |
tokens=x,y,m-n | 取出被分割后的文本的特定位置 |
usebackq | 如果括号中用单引号括起来,表示字符串 双引号则表示文件路径 如果是尖引号`...`,则表示里面是可执行的命令 |
示例如下,即以a为分隔符,并且忽略d开头的行。
js
>for /f "delims=a eol=d" %i in (test.txt) do @echo %i
nobody knows the little rose
it might
nd lift it up to thee
下面的示例,含义是以空格为分隔符,然后取出第1,2,4个单词。这里有一个离谱的地方,就是迭代参量是从i开始往后查字母表,下面的示例中,虽然表面上参与迭代的只有%i,但最后%i只表示第一个单词;%j和%k则分别代表第二个和第四个单词。
js
>for /f "tokens=1,2,4" %i in (test.txt) do @echo %i %j %k
nobody knows little
it might pilgrim
did i take
and lift up
下面是usebackq尖括号模式的示例,其中dir表示打印当前路径的子路径,其基本格式是日期、时间、类型、文件名等,由于默认以空格为分隔符,所以只打印出了第一列值。skip=10表示忽略最开头的10行。
js
>for /f "usebackq skip=10" %i in (`dir`) do @echo %i
2023/08/15
2023/08/15
2023/08/15
6
2