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
相关推荐
玉梅小洋10 小时前
Windows 10 Android 构建配置指南
android·windows
雨中风华16 小时前
Linux, macOS系统实现远程目录访问(等同于windows平台xFsRedir软件的目录重定向)
linux·windows·macos
yuuki23323318 小时前
【C++】继承
开发语言·c++·windows
非凡ghost19 小时前
PowerDirector安卓版(威力导演安卓版)
android·windows·学习·软件需求
疯狂敲代码的老刘21 小时前
JDK 1.6到25 全版本网盘合集 (Windows + Mac + Linux)
java·linux·windows·macos·jdk
love530love1 天前
Windows 下 GCC 编译器安装与排错实录
人工智能·windows·python·gcc·msys2·gtk·msys2 mingw 64
猫头虎1 天前
OpenClaw开源汉化发行版:介绍、下载、安装、配置教程
运维·windows·开源·aigc·ai编程·agi·csdn
luffy54591 天前
windows下通过docker-desktop创建redis实例
windows·redis·docker·容器
程序员敲代码吗1 天前
Windows组策略限制规避指南:深入解析与实际操作
windows
黄大帅@lz1 天前
openai提示词学习
windows·学习