`
weihe6666
  • 浏览: 429987 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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
分享到:
评论

相关推荐

    DOS FOR 循环

    强大的DOS命令--FOR循环. FOR循环可以用你指定的循环范围生成一系列命令。 FOR循环可以使一些不支持通配符的命令对一系列文件进行操作。

    DOS批处理高级教程 第二章 DOS循环for命令详解

    批处理 bat中的for命令的作用,非常的不错,可以节省很多效率,它可以读取文章的没一行,循环执行ping命令,探索端口,学习批处理如果不学习for将是个遗憾,希望大家多看看for 命令的实际应用的例子

    DOSfor循环例子

    DOS for循环例子。主要是项目中用到的,临时放上来了。

    DOS批处理 FOR 高级用法.txt

    DOS批处理 FOR 高级用法.txt

    终极dos批处理for循环命令详解

    对一个或一组文件,字符串或命令结果中的每一个对象执行特定命令,达到我们想要的结果

    for循环坑.bat

    [1]For循环中变量 %var%和!var!的使用区别 [2]For中嵌套goto和行标签跳转发生意外 [3]For中嵌套goto和行标签跳转发生意外的解决方案 [4]FOR /F 枚举字符串中以空格分割的元素 [5]FOR /F 枚举当前目录下的文件 [6] [Q...

    DOS 批处理命令For循环命令详解

    for命令是一种对一系列对象依次循环执行同一个或多个命令的在命令行或批处理中运行的命令,结合一些Windows管理中的程序后,其处理功能强大、应用灵活方便程度令人刮目相看

    DOS批处理高级教程

    DOS批处理高级教程:第二章 DOS循环for命令详解 DOS批处理高级教程:第三章 for命令中的变量 DOS批处理高级教程:第四章 批处理中的变量 DOS批处理高级教程:第五章 set命令详解 DOS批处理高级教程:第六章 if...

    经典之dos命令特殊字符含义

    经典之dos命令特殊字符含义(转载) @ \\隐藏命令的回显。 ~ \\在for中表示使用增强的变量扩展; 在set中表示使用扩展环境变量指定位置的字符串; 在set/a中表示按位取反。 % \\使用两个%包含一个字符串表示引用...

    DOS批处理高级教程.doc

    第一章+批处理基础 第二章+DOS循环for命令详解 第三章+FOR命令中的变量 第四章+批处理中的变量 第五章+set命令详解 第六章+if命令讲解 第七章+DOS批处理编程高级技巧

    MSDOS批处理基础和技巧

    第2章 DOS循环:for命令详解.doc 第3章 FOR命令中的变量.doc 第4章 批处理中的变量.doc 第5章 set命令详解.doc 第6章 if命令讲解.doc 第7章 DOS编程高级技巧--结束篇.doc 附——批处理常用符号详解.doc

    Dos批处理高级教程

    本教程详细介绍Dos批处理的使用方法的电子书。 第一章:批处理基础 第二章:DOS循环for命令详解 第三章:FOR命令中的变量 第四章:批处理中的变量 第五章:set命令详解 第六章:IF命令详解 第七章:DOS编程高级技巧

    Dos命令大全

    for 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。 在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable for {%variable|%%variable} in (set) do command [ CommandLineOptions] %...

    DOS编程高级技巧,命令详解,相关知识

    第七章 DOS编程高级技巧 一、界面设计 二、if…else…条件语句 三、循环语句 四、子程序 五、用ftp命令实现自动下载 六、用7-ZIP实现命令行压缩和解压功能 七、调用VBScript程序 八、将批处理转化为可执行文件 九、...

    【DOS】修复目录名称

    1、windows系统 2、dos命令学习 3、for循环修改目录文件-为目录添加统一的前缀或后缀 4、资源描述太长了吧,简单的功能不需要太长的描述诶 5、请关注https://www.66ams88.vip,本人持续更新资源

    DOS批处理高级教程精选

    else…条件语句 三、循环语句 四、子程序 五、用ftp命令实现自动下载 六、用7-ZIP实现命令行压缩和解压功能 七、调用VBScript程序 八、将批处理转化为可执行文件 九、时间延迟 1、利用ping命令延时 2、利用for命令...

    DOS批处理高级教程精选合编

    第七章 DOS编程高级技巧 一、界面设计 二、if…else…条件语句 三、循环语句 四、子程序 五、用ftp命令实现自动下载 六、用7-ZIP实现命令行压缩和解压功能 七、调用VBScript程序 八、将批处理转化为可执行...

    DOSBox-SVN-64-bit-for-macOS:适用于macOS的DOSBox SVN 64位

    DOSBox SVN(4442)的此内部版本包括以下修补程序: Munt:适用于MT-32 / CM-32L仿真 Glide:准备与OpenGlide库一起使用,以支持3dfx图形“直通”(请参阅​​我在Github上的OpenGlide库) 3dfx Voodoo:3dfx ...

Global site tag (gtag.js) - Google Analytics