Windows批处理for循环

文章目录

批处理系列: set与变量🪟 函数传参和跳转🪟 if语句

常规模式

程序之所以能替代人,就是因为它可以不眠不休地进行重复性操作,批处理指令自然也提供了循环工作的逻辑,此即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
相关推荐
雪 狼17 分钟前
unity对于文件夹的操作
windows·unity·游戏引擎
爱分享的码瑞哥7 小时前
Rust 进阶教程
开发语言·windows·rust
初学️计算9 小时前
网络协议与标准
运维·服务器·windows
ac-er888810 小时前
win10使用小技巧二
windows·技巧·虚拟键盘·防止复制·安装字体
日出等日落10 小时前
Windows系统安装分布式搜索和分析引擎Elasticsearch与远程访问详细教程
windows·分布式·elasticsearch
胡子洲11 小时前
Windows电脑PC使用adb有线跟无线安装apk包
windows·adb·电脑
大卫的纯爱战士15 小时前
文件读写操作之c语言、c++、windows、MFC、Qt
c语言·c++·windows·qt·mfc
栩栩云生20 小时前
[240706] 史蒂夫·乔布斯近40年前就预言了苹果智能 | Globalping 用于网络诊断和性能测试的命令行工具
命令行·apple·资讯
栗克20 小时前
SerialportToTCP② 全
网络·windows·udp·c#·.net·tcp·用户界面
分享者花花1 天前
如何从相机的存储卡中恢复原始照片
windows·数码相机·macos·ios·智能手机·电脑·iphone