for

为一组文件中的每个文件运行指定命令。

Syntax

for {%% | %}<variable> in (<set>) do <command> [<commandlineoptions>]

Parameters

Parameter Description
{%% \| %}<variable> Required. 表示可替换参数。 使用单个百分号 (%) 在命令提示符下执行 for 命令。 使用双百分号 (%%) 在批处理文件中执行 for 命令。 变量区分大小写,并且必须使用字母值表示,例如 %a%b%c
(<set>) Required. 指定要对其运行命令的一个或多个文件、目录或文本字符串或值范围。 需要使用括号。
<command> Required. 指定要对每个文件、目录或文本字符串执行的命令,或对 set 中包含的值范围执行的命令。
<commandlineoptions> 指定要与指定命令一起使用的任何命令行选项。
/? 在命令提示符下显示帮助。

Remarks

  • 可以在批处理文件中使用此命令,也可以直接从命令提示符使用此命令。

  • 以下属性适用于 for 命令:

    • 此命令将 % variable%% variable 替换为指定集中的每个文本字符串,直到指定的命令处理完所有文件。

    • 变量名称区分大小写并且是全局性的,一次最多不能超过 52 个处于活动状态。

    • 为避免与批处理参数混淆,%0您可以通过 %9将除数字 09 之外的任何字符用于变量。 对于简单的批处理文件,单个字符(如 %%f)将起作用。

    • 您可以在复杂批处理 文件中使用多个 变量值来区分不同的可替换变量。

  • set 参数可以表示一组文件或多组文件。 您可以使用通配符(*)来指定文件集。 以下是有效的文件集:

    (*.doc)
    (*.doc *.txt *.me)
    (jan*.doc jan*.rpt feb*.doc feb*.rpt)
    (ar??1991.* ap??1991.*)
    
  • 使用此命令时, set 中的第一个值将替换 % variable%% variable,然后指定的命令处理此值。 这一直持续到处理与 设置 值相对应的所有文件(或文件组)为止。

  • indo 不是参数,但必须将它们与此命令一起使用。 如果省略其中任何一个关键字,则会出现错误消息。

  • 如果启用了命令扩展(这是默认值),则支持以下其他形式的 for

    • 仅限目录:如果 set 包含通配符(*),则对与 set 匹配的每个目录(而不是指定目录中的一组文件)执行指定的命令。 语法为:

      for /d {%%|%}<variable> in (<set>) do <command> [<commandlineoptions>]
      
    • 递归的: 遍历根于 drivepath 的目录树,并在树的每个目录中执行 for 语句。 如果在 /r 之后没有指定目录,则使用当前目录作为根目录。 如果 set 只是单个句点 (.),则它仅枚举目录树。 语法为:

      for /r [[<drive>:]<path>] {%%|%}<variable> in (<set>) do <command> [<commandlineoptions>]
      
    • 迭代值范围:使用迭代变量设置起始值 (start#),然后逐步通过设置的值范围,直到该值超过设置的结束值 (end#)。 /l 通过比较 start# 和 end# 来执行迭代。 如果 start# 小于 end#,则执行命令。 当迭代变量超过 end# 时,命令 shell 退出循环。 您还可以使用负 步长 # 以递减值逐步执行范围。 例如,(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> [<commandlineoptions>]
      
    • 迭代和文件解析:使用文件解析来处理命令输出、字符串和文件内容。 使用迭代变量定义要检查的内容或字符串,并使用各种 parsingkeywords 选项进一步修改解析。 使用 parsingkeywords token 选项指定哪些标记应作为迭代变量传递。 在没有标记选项的情况下使用时, /f 将仅检查第一个标记。

      文件解析包括读取输出、字符串或文件内容,然后将其拆分为单独的文本行,并将每一行解析为零个或多个标记。 然后调用 for 循环,并将迭代变量值设置为标记。 默认情况下, /f 从每个文件的每一行传递第一个空白分隔标记。 空行将被跳过。

      语法为:

      for /f [<parsingkeywords>] {%%|%}<variable> in (<set>) do <command> [<commandlineoptions>]
      for /f [<parsingkeywords>] {%%|%}<variable> in (<literalstring>) do <command> [<commandlineoptions>]
      for /f [<parsingkeywords>] {%%|%}<variable> in ('<command>') do <command> [<commandlineoptions>]
      

      set 参数指定一个或多个文件名。 在移动到 集中的下一个文件之前,打开、读取和处理每个文件。 要覆盖缺省解析行为,请指定 parsingkeywords。 这是一个带引号的字符串,其中包含一个或多个用于指定不同分析选项的关键字。

      如果使用 usebackq 选项,请使用以下语法之一:

      for /f [usebackq <parsingkeywords>] {%%|%}<variable> in (<set>) do <command> [<commandlineoptions>]
      for /f [usebackq <parsingkeywords>] {%%|%}<variable> in ('<literalstring>') do <command> [<commandlineoptions>]
      for /f [usebackq <parsingkeywords>] {%%|%}<variable> in (`<command>`) do <command> [<commandlineoptions>]
      

      下表列出了可用于 parsingkeywords 的解析关键字。

      Keyword Description
      eol=<c> 指定行尾字符(只有一个字符)。
      skip=<n> 指定文件开头要跳过的行数。
      delims=<xxx> 指定分隔符集。 这将替换默认分隔符集,即空格和制表符。
      tokens=<x,y,m-n> 指定每次迭代时将每行中的哪些标记传递给 for 循环。 因此,会分配额外的变量名。 m-n 指定一个范围,从 m个标记到 n个标记。 如果 tokens= 字符串中的最后一个字符是星号 (*),则分配一个附加变量,并接收解析的最后一个标记之后的行中的剩余文本。
      usebackq 指定将双引号字符串作为命令运行,使用单引号字符串作为文字字符串,或者对于包含空格的长文件名,允许将 <set> 中的每个文件名都括在双引号中。
    • 变量替换: 下表列出了可选语法(对于任何变量 I):

      带修饰符的变量 Description
      %~I 扩展 %I,这将移除所有周围的引号。
      %~fI %I 扩展为完全限定的路径名。
      %~dI %I 扩展为仅包含驱动器号。
      %~pI %I 扩展为仅包含路径。
      %~nI %I 扩展为仅包含文件名。
      %~xI %I 扩展为仅包含文件扩展名。
      %~sI 将路径扩展为仅包含短名称。
      %~aI %I 扩展为文件属性。
      %~tI %I 扩展为文件的日期和时间。
      %~zI %I 扩展为文件的大小。
      %~$PATH:I 搜索 PATH 环境变量中列出的目录,然后将 %I 扩展为找到的第一个目录的完全限定名称。 如果未定义环境变量名称或搜索找不到文件,则此修饰符将展开为空字符串。

      下表列出了可用于获取复合结果的修饰符组合。

      带组合修饰符的变量 Description
      %~dpI %I 扩展为仅包含驱动器号和路径。
      %~nxI %I 扩展为仅包含文件名和扩展名。
      %~fsI %I 扩展为仅包含短名称的完整路径名。
      %~dp$PATH:I 在 PATH 环境变量中列出的目录中搜索 %I,然后扩展为找到的第一个目录的驱动器号和路径。
      %~ftzaI 扩展 %I 为类似于 dir 的输出行。

      在上面的示例中,可以将 %I 和 PATH 替换为其他有效值。 变量名称的有效值结束%~语法。

      通过使用大写变量名(例如 %I),可以使代码更具可读性,避免与修饰符混淆,这些修饰符不区分大小写。

  • 解析字符串:你可以在直接字符串上使用解析逻辑,方法是:使用双引号(不带 usebackq)或单引号(带usebackq)--例如,(MyString) 或 ('MyString')。for /f<literalstring> <literalstring> 被视为来自文件的单行输入。 解析用双引号括起的 <literalstring> 时,命令符号(如 \ & | > < ^)被视为普通字符。

  • 解析输出: 您可以使用该 for /f 命令通过在括号之间放置反引号 <command> 来解析命令的输出。 它被视为传递给子 Cmd.exe的命令行。 输出将捕获到内存中,并像分析文件一样进行分析。

Examples

要在批处理文件中使用 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。 否则,引号将被解释为定义要解析的文字字符串。

%ifor 语句中显式声明。 %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