免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1207 | 回复: 0
打印 上一主题 下一主题

批处理For命令应用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-01 09:13 |只看该作者 |倒序浏览

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命令对于我们机房 管理 员来说是一个非常实用的命令,它可以批量地完成很多操作。在这里我们使用windows 2000版本中的for命令,因为windows 2000中的for命令功能比windows 98中增强了很多。下面举几个比较实用的例子。
  
  一、测试单网段内所有计算机的连通性
  
  为了检测机房内所有计算机的连通性,不用一个一个地输入命令,我们只要输入一条命令就可以了。
  
  首先建立一个批处理文件pingall.bat,然后写入一条命令:
  
  @for /l %%a in (1,1,254) do ping 192.168.0.%%a  find "reply">>pingall.log
  
  说明:“/l”参数代表迭代,“%%a”是可替换参数,“(1,1,254)”表示从1开始,步长为1,一直到254。“find"reply">>pingall.log”表示一旦发现reply就将结果写入pingall.log中。
  
  运行该批处理程序后,我们只要查看pingall.log就可以知道机房内电脑的连通情况了。但是这个批处理程序运行还是有点缺陷,即运行速度比较慢。我们在ping命令后加上如下参数:-n 1 -l 16 -w 100,命令重新改写为:
  
  @for /l %%a in (1,1,254) do ping 192.168.0.%%a -n 1 -l 16 -w 100 find "reply">>pingall.log
  
  这样该程序就可以很快扫描完所有的计算机。
  
  二、批量建立用户
  
  假设我们要建立60个学生用户,分别是s1、s2……s60。建立一个批处理程序,输入如下命令:
  
  @for /l %%a in (1,1,60) do net user s%%a /
  
  三、批量绑定ip地址和mac地址
  
  可专使用一些mac地址扫描工具将mac地址扫描出来,然后将ip地址和mac地址保存到一个文件中。格式如下:
  
  192.168.0.1 00-e0-4c-60-0c-f6
  
  192.168.0.2 00-e0-4c-50-07-8d
  
  ……
  
  192.168.0.60 00-e0-4c-50-07-80
  
  将该文件命名为ipmac.txt。
  
  建立一个批处理程序然后输入:
  
  @for /f %%a in (ipmac.txt) do arp -s %%a
  
  说明:“/f”是使用for命令的文件解析功能,该命令就是将ipmac.txt中的每一行解析为一个参数,将ipmac.txt和批处理程序保存到一个文件夹内。运行该程序,ip地址和mac地址就绑定好了。
  
  四、查看局域网中所有的共享文件夹
  
  学生常常在机房中共享很多文件夹,有的学生将自己的作业共享给别的同学,为了查清所有的共享,我们可以输入如下命令:
  
  @for /l %%a in (1,1,60) do net view s%%a  find /v"命令">>allshare.log
  
  说明:“/v”表示除了字符所在行以外的结果都输出。
  
  运行该命令,打开allshare.log我们就可以知道谁私自共享文件夹了。
  
  五、批量建立学生文件夹
  

  假设要建立s1、s2……s60,总共60个文件夹。使用如下命令建立:
  
  @for /l %%a in (1,1,60) do md s%%a
  
  如果要使用学生的真实姓名来建立文件夹,可以先在一个文本文件中输入学生姓名,每个姓名要占一行。然后保存为name.txt,然后输入:
  
  @for /f %%a in (name.txt) do md %%a
  
  将该命令保存为一个批处理程序,和name.txt保存到一个文件夹中,然后运行该程序,就会建立很多的文件夹。

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/11910/showart_411938.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP