DOS 之for循环

for命令主要用于在指定范围内循环之行命令:
for {%variable|%%variable} in (set) do command [ CommandLineOptions]

1. 可以用 /r 参数遍历整个目录树
2. 可以用 /f 参数将文本文件内容作为循环范围
3. 可以用 /f 参数将某一命令执行结果作为循环范围
4. 可以用 %~ 操作符将文件名分离成文件名、扩展名、盘符等独立部分

现分别举例说明如下:
1. 用 /r 遍历目录树
当用 *.* 或 *.txt 等文件名通配符作为 for /r 的循环范围时,可以对当前目录下所有文件(包括子目录里面的文件)进行操作。举个例子,你想在当前目录的所有txt文件(包括子目录)内容中查找"bluebear"字样,但由于find本身不能遍历子目录,所以我们用for:

for /r . %a in (*.txt) do @find "bluebear" %a

find 前面的 @ 只是让输出结果不包括 find 命令本身。这是DOS很早就有的功能。和FOR无关。
当用 . 作为循环范围时,for 只将子目录的结构(目录名)作为循环范围,而不包括里面的文件。有点象 TREE 命令,不过侧重点不同。TREE 的重点是用很漂亮易读的格式输出,而FOR的输出适合一些自动任务,例如,我们都知道用CVS管理的项目中,每个子目录下都会有一个CVS目录,有时在软件发行时我们想把这些CVS目录全部去掉:

for /r . %a in (.) do @if exist %a\CVS rd /s /q %a\CVS

先用 if exist 判断一下,是因为 for 只是机械的对每个目录进行列举,如果有些目录下面没有CVS也会被执行到。用 if exist 判断一下比较安全。
这种删除命令威力太大,请小心使用。最好是在真正执行以上的删除命令前,将 rd /s /q 换成 @echo 先列出要删出的目录,确认无误后再换回rd /s /q:

for /r . %a in (.) do @if exist %a\CVS @echo %a\CVS

可能目录中会多出一层 ".",比如 c:\proj\release\.\CVS ,但不会影响命令的执行效果。
2. 将某一文件内容或命令执行结果作为循环范围:
假如你有一个文件 todel.txt,里面是所有要删除的文件列表,现在你想将里面列出的每个文件都删掉。假设这个文件是每个文件名占一行,象这样:

c:\temp\a1.txt
c:\temp\a2.txt
c:\temp\subdir\b3.txt
c:\temp\subdir\b4.txt

【转】
1.FOR 语句
for %a in (****) do @echo %a 这种形式的FOR语句是最为简单的一种,没有/D /R /F等参数开关,用法也很普通,下面给大家简单介绍一下。

C:\>for %a in (aa.txt bb.txt cc.txt) do @echo %a
运行结果如下:
aa.txt
bb.txt
cc.txt

当然了,我们使用通配符也是可以的
for %a in (*) do @echo %a
for %a in (a?*.txt) do @echo %a
等等一些方法都是大同小异。

用FOR语句可以简化运行命令的重复性,在一定程度上提高了运行速度,减少了代码量。

for %a in (*.cmd *.txt) do @echo %a

显示当前目录下所有后缀名为.CMD 和.TXT的文件,这对处理多个文件提供了方便。

当然我们也可以这样用它,以%PATH%环境变量为例,如下:

for %a in ("%path:;=" "%") do @echo %~a

运行结果如下:

C:\WINDOWS\system32
C:\WINDOWS
C:\WINDOWS\System32\Wbem

目的就是把PATH环境变量的每个路径分离出来进行逐行显示

2.FOR /D 语句

打开CMD命令提示符,在传说中的黑色框中输入如下语句:

C:\>for /d %a IN (*) do @echo %a

9527
ccp
Documents and Settings
ppw
Program Files
RavBin
WINDOWS
WINNT

结果如上,显示当前目录下各个目录名称,不包括文件名,对于 (*)--括号中的内容我们称之为"集", 其实我们也可以用(*.*)形式运行,意
思是指全部内容,其实它就是我们熟悉的通配符,而我理解的/D的作用跟过滤效果差不多(/D-DIRECTORY的缩写)就是只显示目录名!

同样的,我们运行如下语句:

C:\>for /d %a in (w*) do @echo %a
结果如下:

WINDOWS
WINNT

这条语句就是显示以W开头的目录名称!(不区分大小写)

C:\>for /d %a in (w*s) do @echo %a
WINDOWS

不用我说了吧,这跟通配符的用法有关。

我们在说说用?作为通配符使用在/D参数上

C:\>for /d %a in (w?nnt) do @echo %a---成功执行,不用说有WINNT目录,如果执行不成功表示没有此目录
WINNT

C:\>for /d %a in (w??nnt) do @echo %a--不成功,由于通配符的特性,只能匹配像WIINNT这样的目录

C:\>for /d %a in (w?nnt?) do @echo %a--成功,也有两个??为何成功,因为最后结尾处是?通配符,可以匹配如winnt winntt样式的目录
WINNT

好了,不说通配符的事情了,继续...


3.FOR /R 语句

本人理解/R这个R是recursive的缩写,也就是递归的意思。

递归嘛,就是对其目录及其子目录的所有文件进行操作,这全部归功于/R这个参数,下面我们举例说明一下用法:

for /r %a in (*) do @echo %a 同 for /r . %a in (*) do @echo %a 效果是一样的,不指定或者用.表示当前目录

此句的作用是显示当前目录及其子目录下的所有文件,当然也可以指定我们要操作的目录。

for /r d:\ansi %a in (*.txt) do @echo %a 

显示D:\ANSI目录及其子目录下所有的.TXT的文件名称

如果我们指定的目录名含有空格可以使用双引号来解决。

for /r "c:\program files" %a in (ok.*) do @echo %a

这样我们就可以显示c:\program files目录及其子目录下文件名为OK的所有文件。

虽然FOR /R 语句官方帮助提到如果集的内容为一个.点,可以列举该目录树,但我总觉得不爽,有的时候为了美观没有必要偷懒,其实列举目

录树我们可以用/D /R两个参数的联合使用来实现,如下:

for /d /r "c:\program files" %a in (*) do @echo %a---美观

for /r "c:\program files" %a in (.) do @echo %a ----感觉不爽


这样就可以列举c:\program files目录下所有目录及其子目录(不包括文件),把集设置为点号也未尝不可。


4.FOR /L 语句

FOR /L %%parameter IN (start,step,end) DO command 我们可以这样看待这个语句,这样便于大家理解。

for /l %a in (1,1,10) do @echo %a ------正序显示

for /l %a in (10,-1,0) do @echo %a------倒序显示

循环显示1-10这10个数字,我们可以随意修改这些数字,但是我们应该注意一些问题,如下:

(start,step,end)

step为正数时,end>=start
step为负数时,end<=start

当step为零时,情况如下:

start>end  运行无效
start<=end 无限循环

我们还需要知道这三个数字之间可以用其他分隔符,例如:

for /l %a in (1,1,10) do @echo %a
for /l %a in (1 1 10) do @echo %a
for /l %a in (1=1=10) do @echo %a
for /l %a in (1,1,10) do @echo %a
for /l %a in (1<tab>1<tab>10) do @echo %a

这五条语句运行的效果是一样的,<tab>---TAB键


5.FOR /F 语句

可算到了/F参数啦,很多新手对其掌握的不是太好,关键是要灵活应用就好,用多了就习惯了,习惯了就好了.....

首先我们要进行介绍的就是/F参数下的这几个选项:
   
   delims=xxx  以xxx作为FOR语句的分隔符,可以是多个符号或字符,默认值是一个空格
   skip=n 在文件开始跳过的行数。默认值是零,如果SKIP=X(X如果是0或者负数语句执行都会失败,因为零或负数根本就没有意义)
   eol=; 指一个行注释字符的结尾,默认指是分号(;)
tokens=n 指每行准备要被替代的符合条件的标记,默认值是1
   usebackq 使用后引号进行FOR语句的处理。usebackq=use back quote(` `--属于后引号)

  我知道,对于一些FOR语句的帮助中在说明这几个选项的时候很多人对其描述的内容不是很清楚,以上说明其实也不是那么好理解,我只是

粗略介绍一下,想要真正理解这些选项的用途还要在实际应用中去体会,这样会更好的认识这些选项的含义。

  我会列举大量实例以便说明各个选项的用途:
  
  首先要让大家清楚/F在处理的时候有三种形式:

 FOR /F "选项" %? IN (文件名) DO command
 FOR /F "选项" %? IN ("字符串") DO command
 FOR /F "选项" %? IN ('命令') DO command   

1.我们首先要说DELIMS这个选项的一些应用

① for /f "delims==" %? in ('set') do @echo %?
以等号作为分隔符处理SET命令运行的结果,显示所有的变量名称。

 ② 例如我们有ansi.txt文件,内容如下: 
  
  AAA BBB CCC
DDD EEE BBB
UUU LLL PPP
   
  for /f "delims=" %a in (ansi.txt) do @echo %a 我们没有给delims选项赋值,所以没有任何分隔符,就是显示文件的全部内容,包括

行首行尾有空格的情况。

2.TOKENS选项的一些应用
 
 ①我们还拿ansi.txt文件做测试
  
  for /f "tokens=2" %a in (ansi.txt) do @echo %a

| AAA | BBB | CCC |
tokens=1 tokens=2 tokens=3

默认以空格为分隔符,TOKENS=2取得第二个标记,所以以上这条语句取得了BBB EEE LLL 3个数值。

 ②for /f "tokens=*" %a in (ansi.txt) do @echo %a

tokens=*取得所有标记,这种情况显示出来的结果会去掉行首前的空格,不会去掉行尾空格。
 例如:
 [ AAA BBB CCC ]
[ DDD DSDFDFDF DDFDF ]
[VVSDF S ]

[]这个只是为了显示出空格的位置,执行以上语句结果如下:
 
 [AAA BBB CCC ]
[DDD DSDFDFDF DDFDF ]
[VVSDF S ]

 ③for /f "tokens=1,3-5*" %a in ("A B C D E F G H") do @echo %a %b %c %d %e

A B C D E F G H
tokens 1 2 3 4 5 6 7 8
%a %b %c %d 最后一个标记为*,所以从标记6往后的所有标记都赋值给 %e

 最后得到结果为: A C D E F G H

3.EOL选项
 
  很多人在用FOR语句的时候都不是太过注重这个EOL选项,其实它很烦人的

  我们都知道FOR语句中eol选项默认忽略是以分号(;)开头的行

  for /f "eol= delims=" %a in (" Hello World!") do @echo %a-----无任何显示,忽略了以空格开头的行

  for /f "delims= eol=" %a in (""Hello World!^") do @echo %a----无任何显示,忽略了以双引号开头的行


  两条语句虽然只是eol 和 delims选项掉换了位置但是意义却不同

  第一条eol在前,eol= 表示忽略以空格开头的行!!!

  第二条eol在选项里的最后一个,其实他会忽略以"双引号开头的行,是不是挺烦人的!
  
  由此看来,EOL选项不论是在哪个位置,他都是以等号后面的那个字符做为判断标准的

  那我们怎么来解决这个棘手的问题呢?

  我们可以用一些不常用的特殊字符或符号做为EOL的值,虽然不是很完美,但是一般情况应该可以应付啦!

例如:for /f "eol=退格键 delims=" %%a in ("xxxxxxxxxxxx") do @echo.%%a

其实对于解决一个问题来说最关键的是我们怎么去看待这个问题!

4.SKIP=n 选项
  
  这个选项其实没有什么好说的,大家也都知道,也没有什么特殊的用法,只不过注意几个问题就可以啦

  首先n的值不能是0或者负数,否则会报错!这也是合情合理的。

  for /f "skip=5" %a in (xxx.txt) @echo.%a

跳过xxx.txt文件前5行,然后进行操作,当然我们也可以使用以下语句来实现:

for /f "skip=00000000005" %a in (xxx.txt) @echo.%a 呵呵,只要0后面有数字效果一样,当然,如果你指定SKIP值大于文件本身的行
 
  数,那不会有任何显示啦!!!


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jmlei/archive/2009/04/06/4051494.aspx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值