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
相关推荐
tryCbest1 天前
Windows和Linux设置Https(SSL)访问
linux·windows·https
奔跑吧邓邓子1 天前
【C++实战(68)】从0到1:C++跨平台开发之Windows API深度实战
c++·windows·实战·跨平台·windows api
名誉寒冰2 天前
# 深入理解Linux内核与用户态通信:Netlink机制实战
linux·服务器·windows
byte轻骑兵2 天前
Windows 安全分割利器:strtok_s () 详解
c语言·开发语言·windows·安全
染指11102 天前
11.UE-游戏逆向-内存中的FUObjectArray(深入理解内存数据)
windows·虚幻·ue·unreal engine 4
TeleostNaCl2 天前
使用 jintellitype 库在 Java 程序中实现监听 Windows 全局快捷键(热键)
java·开发语言·windows·经验分享·kotlin·电脑
祈祷苍天赐我java之术2 天前
Redis 有序集合解析
java·前端·windows·redis·缓存·bootstrap·html
你好龙卷风!!!2 天前
mac | Windows 本地部署 Seata1.7.0,Nacos 作为配置中心、注册中心,MySQL 存储信息
windows·mysql·macos
恸流失3 天前
java基础-12 : 单列集合(Collection)
java·开发语言·windows
做运维的阿瑞3 天前
Windows 环境下安装 Node.js 和 Vue.js 框架完全指南
前端·javascript·vue.js·windows·node.js