前面章节介绍 for 语句的基础,以及 /D、/R、/L 扩展用法。本章将介绍 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 还有很多高级功能,这些功能需要通过设置 "options" 来实现,下面将进行逐一介绍。
忽略以指定字符开头的行。可以使用该功能跳过注释。
实例:实例通过 “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 姓名 张三 李四 请按任意键继续. . .
指定在 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 张三 李四 请按任意键继续. . .
指定分隔符号集,替换 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 此时不应有 #|,"。 请按任意键继续. . .
简单的来说就是配置怎样去提取每一行的列,列的数量是根据你配置的 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 请按任意键继续. . .