Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4477922
  • 博文数量: 192
  • 博客积分: 10014
  • 博客等级: 上将
  • 技术积分: 8232
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-21 00:22
文章分类

全部博文(192)

文章存档

2011年(4)

2009年(14)

2008年(174)

我的朋友

分类: WINDOWS

2008-07-16 09:33:21

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

语法
for {%Variable | %%Variable} in (Set) do Command [CommandLineOptions]

参数
{%Variable | %%Variable}

必需。代表可替换的参数。使用 %Variable 通过命令提示符执行 for 命令。使用 %%Variable 在批处理文件中执行 for 命令。变量要区分大小写,并且必须用 Alpha 值表示,例如,%A、%B 或 %C。

(Set)

必需。指定要用指定命令处理的一个或多个文件、目录、数值范围以及文本字符串。需要括号。

Command

必需。指定要对包括在指定的 (Set) 中每个文件、目录、数值范围或文本字符串所执行的命令。

CommandLineOptions

指定要与所指定命令一起使用的任何命令行选项。

/?

在命令提示符下显示帮助。

注释
• 使用 for

可以在批处理文件中或直接从命令提示符使用 for 命令。

• 使用批处理参数

下列属性适用于 for 命令:

• for 命令用 Set 中指定的每个文本字符串替换 %Variable 或 %%Variable,直到 Command 处理完所有文件为止。

• For Variable 名是区分大小写、全局的,并且每次活动的总共不超过 52 个。

• 要避免混淆批处理参数 %0 到 %9,可对 Variable 使用除数字 0 到 9 之外的任何字符。对于简单的批处理文件,单个字符即可生效,例如 %%f。

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


• 指定一组文件

Set 参数可以代表单个或多个文件组。可以使用通配符(即 * 和 ?)指定文件组。以下为有效文件组:

(*.doc)

(*.doc *.txt *.me)

(jan*.doc jan*.rpt feb*.doc feb*.rpt)

(ar??1991.* ap??1991.*)

在使用 for 命令时,Set 中的第一个值代替 %Variable 或 %%Variable,然后由指定的命令处理该值。这会持续到处理完与 Set 值相对应的所有文件(或文件组)为止。

• 使用 in 和 do 关键字

In 和 do 不是参数,但必须将它们与 for 一起使用。如果省略其中任何一个关键字,就会出现错误消息。

• 使用 for 的其他格式

如果启用命令扩展(这是默认设置),则支持 for 的下列其他格式:

• 仅目录

如果 Set 包含通配符(* 和 ?),将对与 Set 相匹配的每个目录(而不是指定目录中的文件组)执行指定的 Command。语法是:

for /D {%% | %}Variable in (Set) do Command [CommandLineOptions]

• 递归

进入根目录树 [Drive:]Path,在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录,则认为是当前目录。如果 Set 只是一个句点 (.),则只枚举目录树。语法是:

for /R [[Drive:]Path] {%% | %}Variable in (Set) do Command [CommandLineOptions]

• 迭代数值范围

使用迭代变量设置起始值 (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)。语法是:

for /L {%% | %}Variable in (Start#,Step#,End#) do Command [CommandLineOptions]

• 迭代及文件解析

使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量定义要检查的内容或字符串,并使用各种 ParsingKeywords 选项进一步修改解析方式。使用 ParsingKeywords 令牌选项指定哪些令牌应该作为迭代变量传递。请注意:在没有使用令牌选项时,/F 将只检查第一个令牌。

文件解析过程包括读取输出、字符串或文件内容,将其分成独立的文本行以及再将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代变量值,调用 for 循环。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。语法的不同点为:

for /F ["ParsingKeywords"] {%% | %}Variabe lin (FileNameSet) do Command [CommandLineOptions]

for /F ["ParsingKeywords"] {%% | %}Variable in ("LiteralString") do Command [CommandLineOptions]

for /F ["ParsingKeywords"] {%% | %}Variable in ('Command') do Command [CommandLineOptions]

FileNameSet 参数指定一个或多个文件名称。每个文件都将被打开、读取和处理,然后再继续执行 FileNameSet 中的下一个文件。要覆盖默认解析行为,请指定 "ParsingKeywords"。这是一个引号括起来的字符串,它包含一个或多个关键字以指定不同的解析选项。

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

for /F ["usebackqParsingKeywords"] {%% | %}Variable in ("FileNameSet") do Command [CommandLineOptions]

for /F ["usebackqParsingKeywords"] {%% | %}Variable in ('LiteralString') do Command [CommandLineOptions]

for /F ["usebackqParsingKeywords"] {%% | %}Variable in ('Command') do Command [CommandLineOptions]

下表列出可以用于 ParsingKeywords 的解析关键字。


关键字 描述
eol=c
指定行尾字符(仅一个字符)。

skip=N
指定在文件的开头跳过的行数。

delims=xxx
指定分隔符集合。这将替换空格和制表符这一默认分隔符集。

tokens=X,Y,M-N
指定将哪些令牌从每行传递到每个迭代的 for 正文。这样就分配了附加变量名称。M-N 格式是一个范围,指定从第 M 个到第 N 个令牌。如果 tokens= 字符串中最后一个字符是星号 (*),那么将分配另外的变量,并接收解析的最后一个令牌之后该行剩余的文本。

usebackq
指定可以使用引号引用 FileNameSet 中的文件名,将后面带有引号的字符串作为一个命令执行,而带有单引号的字符串是文字字符串命令。


  
• 变量替换

已经增强了 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 一样)。





在上述示例中,可以用其他有效值替换 %I 和 PATH。有效的 for 变量名终止 %~ 语法。

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


• 解析字符串

通过将 FileNameSet 用单引号括起来,(即 'FileNameSet'),可以使用 for /F 对直接字符串进行逻辑解析。系统将 FileNameSet 视为从某个文件输入的单行,然后对其进行解析。

• 解析输出

通过将圆括号内的 FileNameSet 变为后面带有引号的字符串,可以利用 for /F 命令解析命令输出。此命令被视为命令行传递给子命令 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。否则,引号将被解释为定义要解析的文字字符串。

在 FOR 语句中显式声明 %i。使用 tokens= 隐式声明 %j 和 %k。只要不会引起试图声明高于字母“z”或“Z”的某个变量,则使用 tokens= 可以指定最多 26 个令牌。

要通过将 FileNameSet 放在括号中间来解析命令输出,请键入:

for /F "usebackq delims==" %i IN ('set') DO @echo %i

这个示例枚举了当前环境中的环境变量名。

返回页首
格式图例

格式 意义
斜体
用户必须提供的信息

粗体
用户必须像显示的一样准确键入的元素

省略号 (...)
可在命令行中重复多次的参数

在括号 ([]) 之间
可选项目

在大括号 ({}) 之间;将选项用管线 (|) 隔开。例如:{even|odd}
用户必须从中只选择一个选项的选项组

Courier font
代码或程序输出

=======================

 

for /?

 

对一组文件中的每一个文件执行某个特定命令。

FOR %variable IN (set) DO command [command-parameters]

  %variable  指定一个单一字母可替换的参数。
  (set)      指定一个或一组文件。可以使用通配符。
  command    指定对每个文件执行的命令。
  command-parameters
             为特定命令指定参数或命令行开关。

在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.

如果命令扩展名被启用,下列额外的 FOR 命令格式会受到
支持:

FOR /D %variable IN (set) DO command [command-parameters]

    如果集中包含通配符,则指定与目录名匹配,而不与文件
    名匹配。

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

    检查以 [drive:]path 为根的目录树,指向每个目录中的
    FOR 语句。如果在 /R 后没有指定目录,则使用当前
    目录。如果集仅为一个单点(.)字符,则枚举该目录树。

FOR /L %variable IN (start,step,end) DO command [command-parameters]

    该集表示以增量形式从开始到结束的一个数字序列。
    因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生
    序列 (5 4 3 2 1)。

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]

    filenameset 为一个或多个文件名。继续到 filenameset 中的
   下一个文件之前,每份文件都已被打开、读取并经过处理。
    处理包括读取文件,将其分成一行行的文字,然后将每行
    解析成零或更多的符号。然后用已找到的符号字符串变量值
    调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开
    的第一个空白符号。跳过空白行。您可通过指定可选 "options"
    参数替代默认解析操作。这个带引号的字符串包括一个或多个
    指定不同解析选项的关键字。这些关键字为:

        eol=c           - 指一个行注释字符的结尾(就一个)
        skip=n          - 指在文件开始时忽略的行数。
        delims=xxx      - 指分隔符集。这个替换了空格和跳格键的
                          默认分隔符集。
        tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
                          的 for 本身。这会导致额外变量名称的分配。m-n
                          格式为一个范围。通过 nth 符号指定 mth。如果
                          符号字符串中的最后一个字符星号,
                          那么额外的变量将在最后一个符号解析之后
                          分配并接受行的保留文本。
        usebackq        - 指定新语法已在下类情况中使用:                   
                          在作为命令执行一个后引号的字符串并且一个单
                          引号字符为文字字符串命令并允许在 filenameset
                          中使用双引号扩起文件名称。

    某些范例可能有助:

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

    会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将
    每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或
    空格定界符号。请注意,这个 for 程序体的语句引用 %i 来
    取得第二个符号,引用 %j 来取得第三个符号,引用 %k
    来取得第三个符号后的所有剩余符号。对于带有空格的文件
    名,您需要用双引号将文件名括起来。为了用这种方式来使
    用双引号,您还需要使用 usebackq 选项,否则,双引号会
    被理解成是用作定义某个要分析的字符串的。

    %i 专门在 for 语句中得到说明,%j 和 %k 是通过
    tokens= 选项专门得到说明的。您可以通过 tokens= 一行
    指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或
    'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,
    同时不能有 52 个以上都在使用中。

    您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,
    用单引号将括号之间的 filenameset 括起来。这样,该字符
    串会被当作一个文件中的一个单一输入行。

    最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将
    括号之间的 filenameset 变成一个反括字符串。该字符串会
    被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进
    内存,并被当作文件分析。因此,以下例子:

      FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i

    会枚举当前环境中的环境变量名称。

另外,FOR 变量参照的替换已被增强。您现在可以使用下列
选项语法:

     ~I         - 删除任何引号("),扩充 %I
     %~fI        - 将 %I 扩充到一个完全合格的路径名
     %~dI        - 仅将 %I 扩充到一个驱动器号
     %~pI        - 仅将 %I 扩充到一个路径
     %~nI        - 仅将 %I 扩充到一个文件名
     %~xI        - 仅将 %I 扩充到一个文件扩展名
     %~sI        - 扩充的路径只含有短名
     %~aI        - 将 %I 扩充到文件的文件属性
     %~tI        - 将 %I 扩充到文件的日期/时间
     %~zI        - 将 %I 扩充到文件的大小
     %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩充
                   到找到的第一个完全合格的名称。如果环境变量名
                   未被定义,或者没有找到文件,此组合键会扩充到
                   空字符串

可以组合修饰符来得到多重结果:

     %~dpI       - 仅将 %I 扩充到一个驱动器号和路径
     %~nxI       - 仅将 %I 扩充到一个文件名和扩展名
     %~fsI       - 仅将 %I 扩充到一个带有短名的完整路径名
     %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
                   到找到的第一个驱动器号和路径。
     %~ftzaI     - 将 %I 扩充到类似输出线路的 DIR

在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
比较易读,而且避免与不分大小写的组合键混淆。

阅读(2274) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~