批处理For命令支持/d、/l、/r、/f四个参数。/d仅列出当前目录下的目录名;/r递归搜索指定路径及其子目录中的文件;/l生成数值序列;/f可解析文件、字符串或命令输出,通过delims、tokens、skip、eol等选项灵活处理内容。
FOR 命令在批处理中常用于处理文本,但其功能远不止于此,还包括许多实用特性。下面介绍其基本格式(此处引用批处理中的格式,若直接在命令行中使用,只需一个 % 号):
FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令
参数:FOR 包含四个参数 /d、/l、/r、/f,具体作用通过后面的示例说明。
%%变量名:变量名可为小写 a~z 或大写 A~Z,区分大小写,FOR 会将每次读取的值赋给该变量。
IN:固定写法。
(相关文件或命令):FOR 要读取的内容,并将其赋值给变量,详见后续示例。
do:固定写法。
执行的命令:针对每个变量的值需要执行的操作。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
也可在 CMD 中输入 for / 查看系统提供的帮助,对照如下:
FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件,支持使用通配符。
command 指定对每个文件要执行的命令。
command-parameters 为特定命令指定参数或命令行开关。
下面逐项讲解每个参数的含义。
系统帮助格式:FOR /D %%variable IN (set) DO command
仅为目录:若 Set(即上述“相关文件或命令”)包含通配符(* 和 ),则对与 Set 匹配的每个目录(而非目录中的文件组)执行指定的 Command。该参数主要用于目录搜索,不会搜索文件。请看示例:
@echo off
for /d %%i in (*) do @echo %%i
pause
将此 BAT 文件保存至 C 盘根目录并执行,即可打印 C 盘根目录下的所有目录名称,文件名称不会显示。
再看另一个示例:若想打印当前目录下名称长度仅为 1~3 个字母的目录:
@echo off
for /d %%i in () do @echo %%i
pause
若当前目录下存在名称长度为 1~3 个字母的目录,则会将其显示出来。
思考题:
@echo off
for /d %%i in (window) do @echo %%i
pause
保存至 C 盘根目录执行,会显示什么?不妨动手试试。
注意:/d 参数仅能显示当前目录下的目录名称,这一点需牢记。
系统帮助格式:FOR /R [[drive:]path] %%variable IN (set) DO command
递归:进入根目录树 [Drive:]Path,在树的每个目录中执行 FOR 语句。若在 /R 后未指定目录,则默认为当前目录。若 Set 仅为句点(.),则只枚举目录树。
前文提到 /d 只能显示当前路径下的目录名称,而 /r 功能更强大——它可以读取当前或指定路径下的所有文件名称(注意是文件名称)。请看示例:
@echo off
for /r c:\ %%i in (*.exe) do @echo %%i
pause
将此 BAT 文件保存至 D 盘任意位置执行,会列出 C 盘根目录及其每个子目录下的所有 EXE 文件。这里的 c:\ 即为搜索路径。
再看另一个示例:
@echo off
for /r %%i in (*.exe) do @echo %%i
pause
这次未指定搜索路径,则以当前目录为搜索路径。例如将 BAT 文件放在 d:\test 下执行,会列出 d:\test 及其所有子目录下的 EXE 文件。
系统帮助格式:for /L %%Variable in (Start#,Step#,End#) do Command
迭代数值范围:使用迭代变量设置起始值 (Start#),然后逐步执行一组范围的值,直至该值超过所设置的终止值 (End#)。/L 通过比较 Start# 和 End# 来执行迭代——若 Start# 小于 End#,则执行命令;若迭代变量超过 End#,则命令解释程序退出此循环。也可使用负的 Step# 进行递减。例如 (1,1,5) 生成序列 1 2 3 4 5,而 (5,-1,1) 生成序列 5 4 3 2 1。
请看示例:
@echo off
for /l %%i in (1,1,5) do @echo %%i
pause
执行后会打印 1 2 3 4 5 共五个数字。(1,1,5) 表示从 1 开始,每次加 1,直到 5 终止。
再看这个:
@echo off
for /l %%i in (1,1,5) do start cmd
pause
执行后会打开 5 个 CMD 窗口。若将 (1,1,5) 改成 (1,1,65535),则会打开 65535 个 CMD 窗口,不强制关机则很难应对。
当然,也可将 start cmd 换成 md %%i,这样会创建指定数量的目录,名称为 1~65535。
包含 /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 a.txt,但 FOR 也可实现:
for /f %%i in (a.txt) do echo %%i
这里会先打开 a.txt,读出所有内容,将每一行作为一个元素,生成集合:
{“第1行第1列 第1行第2列 第1行第3列”,
“第2行第1列 第2行第2列 第2行第3列”,
“第3行第1列 第3行第2列 第3行第3列”}
集合中仅 3 个元素,用 %%i 依次代替每个元素,然后执行 do 后面的命令。
为加深理解,可执行下面两个命令对比效果:
for /f %%i in (a.txt) do echo %%i ' 会显示 a.txt 内容
for %%i in (a.txt) do echo %%i ' 只显示 a.txt 这个名字,不读取内容
默认情况下,for /f 将每一行作为一个元素。但若想将每行进一步分解成更小的内容,FOR 提供了 delims 和 tokens 参数。
delims 的作用:告诉 FOR 每行使用什么作为分隔符,默认分隔符为空格和 Tab 键。仍以 a.txt 为例:
for /f "delims= " %%i in (a.txt) do echo %%i
显示结果为:
第1行第1列
第2行第1列
第3行第1列
因为 delims= 后跟了一个空格,表示将每行按空格分割,默认只取分割后的第一个元素。
tokens 的作用:通过 delims 将每行分成更小的元素后,由 tokens 控制取哪一个或哪几个。例如取第二列:
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:
for /f "tokens=2,3 delims= " %%i in (a.txt) do echo %%i %%j
这里多了一个 %%j,因为 tokens 取两列,用 %%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
执行结果与不加任何参数完全相同。
再看:
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=2 表示跳过前两行:for /f "skip=2 tokens=*" %%i in (a.txt) do echo %%i
结果为:第3行第1列 第3行第2列 第3行第3列。若不加 tokens=*,则只会显示 第3行第1列。
.第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列。

格式:FOR [参数] %%变量名 IN (相关文件或命令) DO 执行的命令
作用:对一个或一组文件、字符串或命令结果中的每一个对象执行特定命令,以达到预期结果。
注意:在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable,而非 %variable。变量名称区分大小写,故 %i 与 %I 不同。
关于参数:FOR 命令可带参数或不带参数,带参数时支持 /d、/l、/r、/f。下面分别说明。
格式:FOR %variable IN (set) DO command [command-parameters]
示例:
for %%i in (t*.*) do echo %%i '显示当前目录下与 t*.* 匹配的文件(仅显示文件名,不显示路径)
for %%i in (d:\mydocuments\*.doc) do @echo %%i '显示 d:\mydocuments 目录下与 *.doc 匹配的文件
格式:FOR /D %variable IN (set) DO command [command-parameters]
用于目录搜索,不搜索文件,且只能显示当前目录下的目录名称(不会搜索子目录)。
示例:
for /d %%i in (c:\*) do echo %%i '显示 C 盘根目录下的所有目录
for /d %%i in () do echo %%i '显示当前目录下名称长度仅 1~3 个字母的目录
格式:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
搜索指定路径及所有子目录中与 set 相匹配的所有文件。
set 中包含通配符( 或 *),则列举 /R 参数指定的目录及其所有子目录中匹配的文件。set 为具体文件名(不含通配符),则枚举该目录树(列出该目录及其所有子目录),并在后面加上具体的文件名,不论该文件是否存在。示例:
for /r c:\ %%i in (*.exe) do echo %%i '列出 C 盘所有子目录下的 EXE 文件
for /r c:\ %%i in (boot.ini) do echo %%i '枚举 C 盘所有目录(实际未必存在该文件)
for /r c:\ %%i in (boot.ini) do if exist %%i echo %%i '良好的搜索命令,仅列出 boot.ini 存在的目录
格式:FOR /L %variable IN (start,step,end) DO command [command-parameters]
以增量形式生成从开始到结束的数字序列。
示例:
for /l %%i in (1,1,5) do @echo %%i '输出 1 2 3 4 5
for /l %%i in (1,2,10) do @echo %%i '输出 1 3 5 7 9
for /l %%i in (100,-20,1) do @echo %%i '输出 100 80 60 40 20
for /l %%i in (1,1,5) do start cmd '打开 5 个 CMD 窗口
for /l %%i in (1,1,5) do md %%i '创建 1~5 共 5 个文件夹
for /l %%i in (1,1,5) do rd /q %%i '删除 1~5 共 5 个文件夹
该参数最为复杂,选项也最多。简要说明:for /f 可分析文件内容、字符串内容或某命令输出的结果,并通过 options 获得所需结果。
格式:
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]
(注意:这里的反引号 ` 是键盘上数字 1 左面的键)
OPTION 关键字详解:
eol=c:指定行注释字符,例如 eol=; 表示忽略以分号开头的行。skip=n:跳过文件前 n 行。delims=xxx:指定分隔符集,替换默认的空格和 Tab。例如 delims=, 表示用逗号和空格作为分隔符。tokens=x,y,m-n:指定每行的哪些令牌(符号)被传递到 FOR 迭代。可分配额外变量。若最后一个字符是 *,则额外变量接收行中剩余的所有文本。例如 tokens=2,3* 会将第二个和第三个符号赋给两个变量,剩下的赋给第三个变量。usebackq:用于处理文件名或路径中包含空格的情况。不使用 usebackq 时:(file) 表示文件,不能加引号;双引号表示字符串;单引号表示命令。使用 usebackq 时:(file) 和 ("file") 均表示文件(允许带空格的文件名);单引号表示字符串;反引号表示命令。file-set:一个或多个文件名。每份文件被打开、读取、处理。处理过程包括读取文件、分成行、每行解析成零或多个令牌,然后用令牌的值调用 FOR 循环。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号,跳过空行。
%i:专门在 FOR 语句中说明,%j 和 %k 通过 tokens= 选项说明。最多可指定 26 个符号(字母 a~z 或 A~Z)。
系统提供的范例:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
说明:分析 myfile.txt 的每一行,eol=; 忽略分号开头的行;tokens=2,3* 将第二、三个符号传给 FOR 程序体;delims= , 用逗号和/或空格作分隔符;%i 取第二个符号,%j 取第三个符号,%k 取剩余部分。
自己动手的几个示例:
1. 分析文件:
FOR /F "eol=; tokens=1,2* delims=,- " %%i in (d:\test.txt) do echo %%i %%j %%k
2. 分析字符串:
for /f "tokens=1,2,3* delims=-, " %%i in ("aa bb,cc-dd ee") do echo %%i %%j %%k %%l
3. 分析命令输出(枚举环境变量):
FOR /F "tokens=1* delims==" %%i IN ('set') DO @echo [%%i----%%j]
若使用了 usebackq,结果完全相同:
1. 分析文件:
FOR /F "usebackq eol=; tokens=1,2* delims=,- " %%i in ("d:\test.txt") do echo %%i %%j %%k
2. 分析字符串:
for /f "usebackq tokens=1,2,3* delims=-, " %%i in ('aa bb,cc-dd ee') do echo %%i %%j %%k %%l
3. 分析命令输出:
FOR /F "usebackq tokens=1* delims==" %%i IN (`set`) DO @echo [%%i----%%j]
FOR 变量参照的替换已被增强。可使用以下选项语法(以 %I 为例):
~I - 删除所有引号,扩展 %I%~fI - 将 %I 扩展为一个完全合格的路径名%~dI - 仅将 %I 扩展为一个驱动器号%~pI - 仅将 %I 扩展为一个路径%~nI - 仅将 %I 扩展为一个文件名%~xI - 仅将 %I 扩展为一个文件扩展名%~sI - 扩展的路径只含有短名%~aI - 将 %I 扩展到文件的文件属性%~tI - 将 %I 扩展到文件的日期/时间%~zI - 将 %I 扩展到文件的大小%~$PATH:I - 查找列在 PATH 环境变量中的目录,并将 %I 扩展到找到的第一个完全合格的名称。若未定义环境变量或找不到文件,则扩展为空字符串还可组合修饰符获得多重结果:
%~dpI - 仅将 %I 扩展为一个驱动器号和路径%~nxI - 仅将 %I 扩展为一个文件名和扩展名%~fsI - 仅将 %I 扩展为一个带有短名的完整路径名%~dp$PATH:i - 查找 PATH 目录,并将 %I 扩展到找到的第一个驱动器号和路径%~ftzaI - 将 %I 扩展为类似 DIR 输出格式的行注意:使用 ~ 语法时,必须用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名更易读。
以下是一个综合示例,可直接保存为 BAT 文件运行,观察变量扩展的效果:
@echo off
echo ---显示 "dir c:\boot.ini /b /ah"
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 不扩展变量 %%i
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~fI %%~fi
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~dI %%~di
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~pI %%~pi
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~nI %%~ni
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~xI %%~xi
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~sI %%~si
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~aI %%~ai
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~tI %%~ti
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~zI %%~zi
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~$PATH:I %%~$PATH:i
echo ---以下显示组合修饰符---
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~dpI %%~dpi
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~nxI %%~nxi
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~fsI %%~fsI
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~dp$PATH:I %%~dp$PATH:i
for /f "delims==" %%i in ('dir c:\boot.ini /b /ah') do echo 扩展变量到~ftzaI %%~ftzai
echo.
echo ---显示 "dir C:\WINDOWS\system32\notepad.exe /b"
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 不扩展变量 %%i
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~fI %%~fi
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~dI %%~di
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~pI %%~pi
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~nI %%~ni
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~xI %%~xi
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~sI %%~si
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~aI %%~ai
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~tI %%~ti
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~zI %%~zi
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~$PATH:I %%~$PATH:i
echo ---以下显示组合修饰符---
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~dpI %%~dpi
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~nxI %%~nxi
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~fsI %%~fsI
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~dp$PATH:I %%~dp$PATH:i
for /f "delims==" %%i in ('dir C:\WINDOWS\system32\notepad.exe /b') do echo 扩展变量到~ftzaI %%~ftzai
Pause
关于 ~I 删除引号的规则:
看一个测试:建立临时文件 temp.txt,内容如下
"1111
"2222"
3333"
"4444"44
"55"55"55
用下面的代码测试:
@echo off
echo ^"1111>temp.txt
echo "2222">>temp.txt
echo 3333^">>temp.txt
echo "4444"44>>temp.txt
echo ^"55"55"55>>temp.txt
FOR /F "delims=" %%i IN (temp.txt) DO echo %%~i
pause
del temp.txt
执行后 CMD 回显:
1111 '字符串前的引号被删除
2222 '首尾引号都被删除
3333" '前无引号,后面引号保留
4444"44 '前面引号删除,中间引号保留
55"55"55 '前面引号删除,中间引号保留
%~fI 示例:
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~fi
pause
放在桌面执行,会显示 C:\Documents and Settings\Administrator\桌面\test.bat 这样的完整路径,而若用 %%i 只显示文件名。
%~dI 示例:仅打印文件所在的盘符。
%~pI 示例:仅打印路径(不含文件名)。
%~nI 示例:仅打印文件名(不含扩展名)。
%~xI 示例:仅打印扩展名。
%~sI 示例:打印短文件名路径。
%~aI:打印文件属性。
%~tI:打印文件日期/时间。
%~zI:打印文件大小。
注意:上面的示例中 "delims==" 可改为 "delims="(不要分隔符)。
%~$PATH:I 示例:
@echo off
FOR /F "delims=" %%i IN ("notepad.exe") DO echo %%~$PATH:i
pause
该命令会在 PATH 环境变量指定的目录中搜索 notepad.exe,若找到则打印其绝对路径,否则打印空字符串或错误信息。注意:这里的文件名需用双引号括起来,且不能使用中文字符的引号。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述