含有/F的for

含有/F的for
格式:
FOR /F ["options"] %%i IN (file) DO command

FOR /F ["options"] %%i IN ("string") DO command

FOR /F ["options"] %%i IN (command) DO command


这个可能是最常用的,也是最强的命令,主要用来处理文件和一些命令的输出结果。

file代表一个或多个文件

string 代表字符串

command代表命令

["options"] 可选

对于FOR /F %%i IN (file) DO command

file为文件名,按照官方的说法是,for会依次将file中的文件打开,并且在进行到下一个文件之前将每个文件读取到内存,按照每一行分成一个一个的元素,忽略空白的行,看个例子。

假如文件a.txt中有如下内容:


第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列


你想显示a.txt中的内容,会用什么命令呢?当然是type,type a.txt

for也可以完成同样的命令:

for /f %%i in (a.txt) do echo %%i

还是先从括号执行,因为含有参数/f,所以for会先打开a.txt,然后读出a.txt里面的所有内容,把它作为一个集合,并且以每一行作为一个元素,所以会产生这样的集合,


{“第1行第1列 第1行第2列 第1行第3列”, //第一个元素

“第2行第1列 第2行第2列 第2行第3列”, //第二个元素

“第3行第1列 第3行第2列 第3行第3列”}   //第三个元素


集合中只有3个元素,同样用%%i依次代替每个元素,然后执行do后面的命令。

具体过程:


用%%i代替“第1行第1列 第1行第2列 第1行第3列”,执行do后面的echo %%i,显示“第1行第1列 第1行第2列 第1行第3列”,

用%%i代替“第2行第1列 第2行第2列 第2行第3列”,执行echo %%i,显示“第2行第1列 第2行第2列 第2行第3列”,

依次,直到每个元素都代替完为止。


为了加强理解/f的作用,请执行一下两个命令,对比即可明白:


for /f %%i in (a.txt) do echo %%i //这个会显示a.txt里面的内容,因为/f的作用,会读出a.txt中
的内容。

for %%i in (a.txt) do echo %%i //而这个只会显示a.txt这个名字,并不会读取其中的内容。


通过上面的学习,我们发现for /f会默认以每一行来作为一个元素,但是如果我们还想把每一行再分解更小的内容,该怎么办呢?不用担心,for命令还为我们提供了更详细的参数,使我们将每一行分为更小的元素成为可能。

它们就是:delims和tokens

delims 用来告诉for每一行应该拿什么作为分隔符,默认的分隔符是空格和tab键

比如,还是上面的文件,我们执行下面的命令:


for /f "delims= " %%i in (a.txt) do echo %%i


显示的结果是:


第1行第1列
第2行第1列
第3行第1列


为什么是这样的呢。因为这里有了delims这个参数,=后面有一个空格,意思是再将每个元素以空格分割,默认是只取分割之后的第一个元素。

执行过程是:


将第一个元素“第1行第1列 第1行第2列 第1行第3列”分成三个元素:“第1行第1列” “第1行第2列” “第1行第3列”,它默认只取第一个,即“第1行第1列”,然后执行do后面的命令,依次类推。


但是这样还是有局限的,如果我们想要每一行的第二列元素,那又如何呢?

这时候,tokens跳出来说,我能做到。

它的作用就是当你通过delims将每一行分为更小的元素时,由它来控制要取哪一个或哪几个。

还是上面的例子,执行如下命令:


for /f "tokens=2 delims= " %%i in (a.txt) do echo %%i


执行结果:


第1行第2列
第2行第2列
第3行第2列

如果要显示第三列,那就换成tokens=3。

同时tokens支持通配符*,以及限定范围。

如果要显示第二列和第三列,则换成tokens=2,3或tokens=2-3,如果还有更多的则为:tokens=2-10之类的。

此时的命令为:


for /f "tokens=2,3 delims= " %%i in (a.txt) do echo %%i %%j


怎么多出一个%%j?

这是因为你的tokens后面要取每一行的两列,用%%i来替换第二列,用%%j来替换第三列。

并且必须是按照英文字母顺序排列的,%%j不能换成%%k,因为i后面是j

执行结果为:


第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列

对以通配符*,就是把这一行全部或者这一行的剩余部分当作一个元素了。

比如:


for /f "tokens=* delims= " %%i in (a.txt) do echo %%i


执行结果为:


第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列

其实就跟for /f %%i in (a.txt) do echo %%i的执行结果是一样的。

再如:


for /f "tokens=2,* delims= " %%i in (a.txt) do echo %%i %%j

执行结果为:


第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列


用%%i代替第二列,用%%j代替剩余的所有

最后还有skip合eol,这俩个简单,skip就是要忽略文件的前多少行,而eol用来指定当一行以什么符号开始时,就忽略它。

比如:


for /f "skip=2 tokens=*" %%i in (a.txt) do echo %%i

结果为:


第3行第1列 第3行第2列 第3行第3列

用skip来告诉for跳过前两行。

如果不加tokens=*的话,执行结果为:


第3行第1列

不知道怎么回事。

再如,当a.txt内容变成:


.第1行第1列 第1行第2列 第1行第3列
.第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列

执行for /f "eol=. tokens=*" %%i in (a.txt) do echo %%i结果是:


第3行第1列 第3行第2列 第3行第3列

用eol来告诉for忽略以“.”开头的行。

同样也必须加tokens=*,否则只会显示“第3行第1列”

### Windows 批处理中的 `for /f` 命令详解 #### 一、基础概念 `for /f` 是一种用于解析文件或字符串并迭代其每一行的命令。该命令可以读取文本文件的内容,并逐行处理这些内容,通常与其他命令组合使用来完成复杂的脚本编写任务[^1]。 #### 二、语法结构 通用格式如下: ```batch FOR /F ["options"] %variable IN (set) DO command [command-parameters] ``` 其中,“options”部分定义如何分割每行数据;“%variable”表示用来存储每次循环得到的数据项;“(set)”指定了要遍历的目标集合,它可以是一个文件名或其他形式的数据源;最后,“DO command [command-parameters]”则是针对每一个提取出来的项目所执行的操作[^2]。 #### 三、选项参数说明 常见的 "options" 参数有以下几个重要组成部分: - `"tokens=n"`:指定想要获取的是哪几列,默认情况下只返回第一列。 - `"delims=xxx"`:设置分隔符列表,比如逗号(,)、空格()等,默认为空白字符作为分隔符。 - `"skip=n"`:跳过前面 n 行不作处理。 - `"usebackq"`:允许使用反引号(`),使得可以在双引号内包含路径中含有空格的情况下的文件名称[^3]。 #### 四、具体实例分析 下面给出几个具体的例子帮助理解上述知识点的应用场景: ##### 示例 1:简单读取文件内容 假设 tmplist.txt 文件中有若干条记录,现在希望将其打印出来: ```batch @echo off for /f "delims=" %%i in (tmplist.txt) do echo %%i pause ``` 这里设置了 `delims=` 来取消默认的空白字符分隔方式,从而确保整个行被当作单一单元传递给变量 `%%i` 进行输出。 ##### 示例 2:按特定字段抽取信息 如果有一个 CSV 格式的日志文件 log.csv ,里面包含了日期时间戳和其他一些属性值,那么可以通过设定合适的 tokens 和 delims 实现仅提取某些感兴趣的字段: ```batch @echo off for /f "tokens=1,2 delims=," %%a in (log.csv) do ( echo Date/Time: %%a - Event Code: %%b ) pause ``` 这段代码会依次取出 csv 文件里的前两列分别赋值给 `%%a` 和 `%%b` 并显示它们代表的时间戳和事件编号。 ##### 示例 3:结合其他命令过滤结果 当需要基于一定条件筛选出符合条件的日志条目时,则可进一步利用管道操作符 (`|`) 或者重定向符号 (`>`, `<`) 将外部工具的结果引入到 for 循环当中来进行更精细的信息挖掘工作。 ```batch @echo off findstr /C:"ERROR" application.log | for /f "tokens=* delims=]" %%g in ('more') do @echo Error Message Found: %%g pause ``` 在这个案例中,先通过 findstr 查找含有 ERROR 关键字的日志行,再经由 more 工具配合 for/f 对匹配上的各行做最终呈现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值