for /F 语句扩展

前面章节介绍 for 语句的基础,以及 /D、/R、/L 扩展用法。本章将介绍 for /F 扩展的详细用法以及注意事项。

FOR /F 基础

/F 扩展是 for 语句最常用的、也是最强的命令。主要用来处理文件和一些命令的输出结果。它可以提取文本文件的内容,进行逐行分析和处理。语法:

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

或者,如果有 usebackq 选项:

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

其中,file-set 为一个或多个文件名。for 语句会逐一分析指定的每个文件,打开指定文件、读取并处理文件内容。处理包括读取文件内容,将文件内容逐行读取,然后将每行解析成零或更多的符号(默认使用空格作为分隔符)。

实例:下面是一个简单的 for /F 语句,该实例将逐行读取 test.txt 文件的内容,然后默认使用空格分隔。然后将分隔后的列赋值给 %%i(这里只是将第一列赋值给%%i)。test.txt 文本文件内容如下:

姓名  年龄   成绩
张三   28     87
李四   32     92

批处理脚本内容如下:

@echo off
for /F %%i in (test.txt) do (
    echo %%i
)
pause

输出结果:

C:\Users\Administrator\Desktop\bat> test.bat
姓名
张三
李四
请按任意键继续. . .

for /F 高级选项

for /F 还有很多高级功能,这些功能需要通过设置 "options" 来实现,下面将进行逐一介绍。

eol=c

忽略以指定字符开头的行。可以使用该功能跳过注释。

实例:实例通过 “eol=#”指定以“#”开头的行为注释行,忽略这些行,不进行处理。

# 用户信息
姓名  年龄   成绩
张三   28     87
李四   32     92

批处理脚本代码:

@echo off
for /F "eol=#" %%i in (test.txt) do (
    echo %%i
)
pause

输出结果:

C:\Users\Administrator\Desktop\bat> test.bat
姓名
张三
李四
请按任意键继续. . .

skip=n

指定在 for 语句解析每个文件时,从文件头部跳过的行数。

实例:使用 skip=2 跳过指定文件的第一行和第二行。

# 用户信息
姓名  年龄   成绩
张三   28     87
李四   32     92

批处理脚本:

@echo off
for /F "skip=2" %%i in (test.txt) do (
    echo %%i
)
pause

输出结果:

C:\Users\Administrator\Desktop\bat> test.bat
张三
李四
请按任意键继续. . .

delims=xxx

指定分隔符号集,替换 for 语句默认的空格和制表符分隔符号。

实例:使用“delims=#”定义使用井号符分割内容。

姓名#年龄#成绩
张三#28#87
李四#32#92

批处理脚本:

@echo off
for /F "delims=#" %%i in (test.txt) do (
    echo %%i
)
pause

输出结果:

C:\Users\Administrator\Desktop\bat> test.bat
姓名
张三
李四
请按任意键继续. . .

实例:可以使用“delims”可以指定多个分隔符,如:“delims=#|,”

姓名#年龄#成绩
张三|28|87
李四,32,92

批处理脚本:

@echo off
for /F "delims=#|," %%i in (test.txt) do (
    echo %%i
)
pause

输出结果:

C:\Users\Administrator\Desktop\bat> test.bat
姓名
张三
李四
请按任意键继续. . .

delims 允许指定多个分隔符,如果指定多个分割符号时,你要指定空格,请将空格放置到最后,不要放置到最前面。实例如下:

姓名#年龄#成绩
张三|28|87
李四,32,92
赵六 30 78

批处理脚本:

@echo off
REM 错误的方式,如果指定多个分隔符时,不要将空格放置到前面
for /F "delims= #|," %%i in (test.txt) do (
    echo %%i
)
REM 正确的方式,将空格放置到 delims 最后
for /F "delims=#|, " %%i in (test.txt) do (
    echo %%i
)
pause

输出结果:

C:\Users\Administrator\Desktop\bat> test.bat
此时不应有 #|,"。   
请按任意键继续. . .

tokens=x,y,m-n

简单的来说就是配置怎样去提取每一行的列,列的数量是根据你配置的 delims 决定了,因为 for 语句将使用 delims 对行进行分割。tokens 语法格式:

  • tokens=m 表示提取第m列;

  • tokens=m,n 表示提取第m列和第n列;

  • tokens=m-n 表示提取第m列至第n列;

  • tokens=* 忽略行首的所有空格;

  • tokens=m* 提取第m列以后的所有字符,星号表示剩余的字符;

注意:输出变量的个数由定义了的tokens决定。在 FOR 语句中显式声明 %%i。使用 tokens= 隐式声明 %%j 和 %%k。只要不会引起试图声明高于字母“z”或“Z”的某个变量,则使用 tokens= 可以指定最多 26 个输出变量。 

我们通过实例来演示怎样去使用 tokens ,要解析的文本文件内容如下:

姓名|年龄|成绩
张三|28|87
李四|32|92
赵六|30|78

(1)使用 tokens=3 提取第三列的数据,对应上面的文本文件为“成绩”列。

@echo off
for /F "delims=| tokens=3" %%i in (test.txt) do (
    echo %%i
)
pause

输出结果:

C:\Users\Administrator\Desktop\bat> test.bat
成绩
87
92
78
请按任意键继续. . .

(2)使用 tokens=1,3 提取第1列和第3列到变量 %%i 和 %%j。代码如下:

@echo off
for /F "delims=| tokens=1,3" %%i in (test.txt) do (
    echo %%i ---- %%j
)
pause

输出结果:

C:\Users\Administrator\Desktop\bat> test.bat
姓名 ---- 成绩
张三 ---- 87  
李四 ---- 92  
赵六 ---- 78  
请按任意键继续. . .

(3)使用 tokens=2-3 提取第2列和第3列,并且将提取的值放入 %%a 和 %%b(如果你指定的是 %%a,则 for 将递增的将第二列放入 %%b、第三列放入 %%c……一直递增到z或Z)。

@echo off
for /F "delims=| tokens=2-3" %%a in (test.txt) do (
    echo %%a ---- %%b
)
pause

输出结果:

C:\Users\Administrator\Desktop\bat> test.bat
年龄 ---- 成绩      
28 ---- 87
32 ---- 92
30 ---- 78
请按任意键继续. . .

(4)使用 tokens=2* 提取第二列即后面的所有列,并且将提取的值放入 %%a 和 %%b。

@echo off
for /F "delims=| tokens=2*" %%a in (test.txt) do (
    echo %%a ---- %%b
)
pause

输出结果:

C:\Users\Administrator\Desktop\bat> test.bat
年龄 ---- 成绩      
28 ---- 87
32 ---- 92
30 ---- 78
请按任意键继续. . .

(5)使用 tokens=* 忽略行首的所有空格。

姓名|年龄|成绩
张三|28|87
李四|32|92
赵六|30|78

批处理脚本:

@echo off
for /F "delims=| tokens=*" %%a in (test.txt) do (
    echo %%a
)
pause

输出结果:

C:\Users\Administrator\Desktop\bat> test.bat
姓名|年龄|成绩      
张三|28|87
李四|32|92
赵六|30|78
请按任意键继续. . .
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号