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