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
相关推荐
染指11102 小时前
50.第二阶段x86游戏实战2-lua获取本地寻路,跨地图寻路和获取当前地图id
c++·windows·lua·游戏安全·反游戏外挂·游戏逆向·luastudio
dntktop3 小时前
Converseen:全能免费批量图像处理专家
windows
一个懒鬼5 小时前
Windows脚本清理C盘缓存
windows·缓存
蚁景网络安全6 小时前
Cobalt Strike 4.8 用户指南-第十四节 Aggressor 脚本
windows·microsoft
Camllia376 小时前
电脑运行库DirectX出问题怎么办?
windows·经验分享·电脑
总是学不会.7 小时前
【集合】Java 8 - Stream API 17种常用操作与案例详解
java·windows·spring boot·mysql·intellij-idea·java集合
CW_ZB6668 小时前
【无标题】
windows
0xdadream8 小时前
powershell美化
windows
Mr-Apple10 小时前
windows编译googletest框架搭配vscode调试
ide·windows·vscode
慕羽★19 小时前
详细介绍如何使用rapidjson读取json文件
linux·c++·windows·json·file·param·rapidjson