for
为一组文件中的每个文件运行指定命令。
语法
for {%% | %}<variable> in (<set>) do <command> [<commandlineoptions>]
参数
参数 | 说明 |
---|---|
{%% \| %}<variable> |
必填。 表示可替换参数。 使用单百分号 (% ) 可在命令提示符下执行 for 命令。 使用双百分号 (%% ) 可在批处理文件中执行 for 命令。 变量区分大小写,并且必须用字母值表示,例如 %a、%b 或 %c。 |
(<set> ) |
必需。 指定要对其运行命令的一个或多个文件、目录或文本字符串或值范围。 需要使用括号。 |
<command> |
必需。 指定要对每个文件、目录或文本字符串执行的命令,或针对 set 中包含的值范围执行的命令。 |
<commandlineoptions> |
指定要与指定命令一起使用的任何命令行选项。 |
/? | 在命令提示符下显示帮助。 |
备注
可以在批处理文件中使用此命令,也可以直接从命令提示符使用此命令。
以下属性适用于 for 命令:
此命令将
% variable
或%% variable
替换为指定集中的每个文本字符串,直到指定的命令处理完所有文件。变量名称区分大小写并且是全局性的,一次最多不能超过 52 个处于活动状态。
可以对变量使用任何字符,但为了避免与批处理参数
%0
到%9
混淆,请避免使用数字 0 到 9。 对于简单的批处理文件,单个字符(如%%f
)将起作用。可以在复杂的批处理文件中对变量使用多个值,以区分不同的可替换变量。
set 参数可以表示单个文件组或多组文件。 可以使用通配符(* 和 ?)指定文件集。 以下是有效的文件集:
(*.doc) (*.doc *.txt *.me) (jan*.doc jan*.rpt feb*.doc feb*.rpt) (ar??1991.* ap??1991.*)
使用此命令时,set 参数中的第一个值将替换
% variable
或%% variable
,然后指定的命令将处理此值。 这一直持续到与 set 值相对应的所有文件(或文件组)都被处理为止。In 和 do 不是参数,但必须将它们与此命令一起使用。 如果省略其中任何一个关键字,则会出现错误消息。
如果启用了命令扩展(默认状态),则支持下列形式的 for:
仅限目录:如果 set 参数中包含通配符(* 或 ?),则将针对与 set 参数匹配的每个目录(而不是指定目录中的一组文件)执行指定的命令。 语法为:
for /d {%%|%}<Variable> in (<Set>) do <Command> [<CommandLineOptions>]
递归:遍历以 drive:path 为根的目录树,并在树的每个目录中执行 for 语句。 如果在 /r 之后没有指定目录,则使用当前目录作为根目录。 如果 set 参数只是一个句点 (.),则仅枚举目录树。 语法为:
for /r [[<drive>:]<path>] {%%|%}<variable> in (<set>) do <command> [<commandlinepptions>]
迭代值范围:使用迭代变量设置起始值 (start#),然后逐步通过设置的值范围,直到该值超过设置的结束值 (end#)。 /l 将通过比较 start# 和 end# 来执行迭代。 如果 start# 小于 end#,则执行该命令。 当迭代变量超过 end# 时,命令 shell 退出循环。 你还可以使用 step# 来逐步减少值的范围。 例如,(1,1,5) 生成序列 1 2 3 4 5,(5,-1,1) 生成序列 5 4 3 2 1。 语法为:
for /l {%%|%}<variable> in (<start#>,<step#>,<end#>) do <command> [<commandlinepptions>]
迭代和文件解析:使用文件解析来处理命令输出、字符串和文件内容。 使用迭代变量定义要检查的内容或字符串,并使用各种 parsingkeywords 选项进一步修改解析。 使用 parsingkeywords 标记选项来指定哪些标记应作为迭代变量传递。 如果使用时不带标记选项,/f 将只检查第一个标记。
文件解析包括读取输出、字符串或文件内容,然后将其拆分为单独的文本行,并将每一行解析为零个或多个标记。 然后调用 for 循环,并将迭代变量值设置为标记。 默认情况下,/f 传递每个文件的每一行中的第一个空白分隔标记。 空行将被跳过。
语法为:
for /f [<parsingkeywords>] {%%|%}<variable> in (<set>) do <command> [<commandlinepptions>] for /f [<parsingkeywords>] {%%|%}<variable> in (<literalstring>) do <command> [<commandlinepptions>] for /f [<parsingkeywords>] {%%|%}<variable> in ('<command>') do <command> [<commandlinepptions>]
set 参数指定一个或多个文件名。 将依次打开、读取和处理每个文件,然后才会移动到 set 参数中指定的下一个文件。 要覆盖默认分析行为,请指定 parsingkeywords。 这是一个带引号的字符串,其中包含一个或多个用于指定不同分析选项的关键字。
如果使用 usebackq 选项,请使用以下语法之一:
for /f [usebackq <parsingkeywords>] {%%|%}<variable> in (<Set>) do <command> [<commandlinepptions>] for /f [usebackq <parsingkeywords>] {%%|%}<variable> in ('<LiteralString>') do <command> [<commandlinepptions>] for /f [usebackq <parsingkeywords>] {%%|%}<variable> in (`<command>`) do <command> [<commandlinepptions>]
下表列出了可用于 parsingkeywords 的分析关键字。
关键字 说明 eol= <c>
指定行尾字符(只有一个字符)。 skip= <n>
指定文件开头要跳过的行数。 delims= <xxx>
指定分隔符集。 这将替换默认分隔符集,即空格和制表符。 tokens= <x,y,m–n>
指定每次迭代时要将每行中的哪些标记传递给 for 循环。 因此,会分配额外的变量名。 m-n 指定从第 m 个到第 n 个标记的范围。 如果 tokens= 字符串中的最后一个字符是星号 (*),则会分配一个额外的变量,并且会接收解析的最后一个标记之后的行上的剩余文本。 usebackq 指定将双引号字符串作为命令运行,使用单引号字符串作为文字字符串,或者对于包含空格的长文件名,允许将 <set>
中的每个文件名都括在双引号中。变量替换:下表列出了可选语法(适用于任何变量 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 命令的输出行。在上面的示例中,可以将
%I
和 PATH 替换为其他有效值。 有效的 for 变量名称将结束 %~ 语法。通过使用大写的变量名(如
%I
),可以提高代码的易读性,并避免与不区分大小写的修饰符混淆。
解析字符串:你可以在直接字符串上使用解析逻辑,方法是:使用双引号(不带 usebackq)或单引号(带usebackq)--例如,(MyString) 或 ('MyString')。
for /f
<literalstring>
<literalstring>
被视为来自文件的单行输入。 解析用双引号括起的<literalstring>
时,命令符号(如\ & | > < ^
)被视为普通字符。解析输出:可以使用
for /f
命令来解析命令的输出,方法是在括号之间加上反引号<command>
。 它将被视为命令行,随后传递给子 cmd.exe。 输出会捕获到内存中,并像文件一样进行解析。
示例
要在批处理文件中使用 for,请使用以下语法:
for {%%|%}<variable> in (<set>) do <command> [<commandlineoptions>]
要使用可替换变量 %f 显示当前目录中扩展名为.doc 或.txt 的所有文件的内容,请键入:
for %f in (*.doc *.txt) do type %f
在前面的示例中,当前目录中扩展名为 .doc 或 .txt 的每个文件都将被替换为 %f 变量,直到显示每个文件的内容。 要在批处理文件中使用此命令,请将所有出现的 %f 替换为 %%f。 否则,将忽略该变量并显示错误消息。
要分析文件并忽略注释行,请键入:
for /f eol=; tokens=2,3* delims=, %i in (myfile.txt) do @echo %i %j %k
此命令将解析 myfile.txt 中的每一行。 此命令将忽略以分号开头的行,并将每行的第二个和第三个标记传递给 for 主体(标记由逗号或空格分隔)。 for 语句的主体引用 %i 以获取第二个标记,引用 %j 以获取第三个标记,引用 %k 以获取所有剩余标记。 如果你提供的文件名包含空格,请在文本两边使用引号(例如,File Name)。 要使用引号,必须使用 usebackq。 否则,引号将被解释为定义要解析的文字字符串。
%i 在 for 语句中显式声明。 %j 和 %k 是使用 tokens= 隐式声明的。 可以使用 tokens= 来指定最多 26 个标记,前提是不会导致尝试声明超过字母 z 或 Z 的变量。
要通过将 set 放在括号中来解析命令的输出,请键入:
for /f "usebackq delims==" %i in (`set`) do @echo %i
要对目录中的所有文件执行递归循环(包括子目录)并回显其完整路径、上次修改时间及其文件大小,请键入:
for /r "C:\My Dir\" %A in (*.*) do echo %~ftzA