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
相关推荐
梓仁沐白1 小时前
ubuntu+windows双系统切换后蓝牙设备无法连接
windows·ubuntu
九鼎科技-Leo5 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
Yang.997 小时前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3
我不瘦但很逗8 小时前
Windows下使用DBeaver连接云数据库(MySQL)
数据库·windows
ashane13149 小时前
Java list
java·windows·list
万里沧海寄云帆9 小时前
Word 插入分节符页码更新问题
windows·microsoft·word
dot.Net安全矩阵10 小时前
.NET 通过模块和驱动收集本地EDR的工具
windows·安全·web安全·.net·交互
编程修仙11 小时前
Collections工具类
linux·windows·python
程序员小羊!13 小时前
高级 SQL 技巧讲解
windows
xiangshangdemayi14 小时前
Windows环境GeoServer打包Docker极速入门
windows·docker·容器·geoserver·打包·数据挂载