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循环相关推荐

  1. dos 退出for循环_循环?一次帮你搞定!

    循环 循环在代码世界的重要性不言而喻,今天我来说一下几种循环代码的组成方式,以及选择最适合你的方式. 想象一下你是个农夫考虑一下你的晚饭如何准备,这就是一个循环. 循环通常具有一个或者多个条件: 开始 ...

  2. dos命令实现循环求和

    FOR /L %variable IN (start,step,end) DO command [command-parameters] 该集表示以增量形式从开始到结束的一个数字序列. 因此,(1,1 ...

  3. 端口基础常识大全+常用端口对照

    端口基础常识大全+常用端口对照 [color=Red][size=4][b]端口基础常识大全[/b][/size][/color] [color=Green]1) 公认端口(Well Known Po ...

  4. opengl win32 nehe

    问题: 1) 缺少 gl/glext.h   gl/wglext.h:  直接到opengl网站上下了.和系统sdk的gl头文件放一起就行 2)缺少freetype相关:  下载freetype已安装 ...

  5. 你会用Ping检测网络吗?

    经常用Ping来检测网络的通断,同样的操作,还可以使用Pathping,但pathping慢一些,好处是可以得到路由信息. 1.连续测试. ping 1.2.3.4 -t 2.设置测试的包大小和个数. ...

  6. 解开硬盘逻辑死锁的一种有效方法 (转)

    解开硬盘逻辑死锁的一种有效方法 (转)[@more@] 解开硬盘逻辑死锁的一种有效方法 西安市西北工业大学418信箱(710072)  肖华勇 一·序言 不知道你是否曾碰到过从软盘和硬盘都启动不了计算 ...

  7. nuget 构建自己的包_适用于企业的NuGet:持续集成自动构建系统中的NuGet

    nuget 构建自己的包 I had the pleasure of speaking at TechEd 2011 North America last week in Atlanta. You c ...

  8. 电脑技巧全书(超详细.)

    目录检索(相关文章在对应的目录下找~~)~~ 1.最全的windows操作系统快捷键-------------------------------------1楼   2.Windows 开始→运行→ ...

  9. 《Windows游戏编程大师技巧》(第二版)第11章

    第三部分:核心游戏编程   第11章 算法.数据结构.内存管理和多线程   第12章 人工智能   第13章 游戏物理   第14章 文字时代   第15章 综合运用:编写游戏! 第11章 算法.数据 ...

  10. 中兴面试总结,华为。技术,市场

    1,软件测试,如何把这个测试做的更好. 进到一个新项目,作为测试人员应该都是想把测试做好,项目在符合客户质量要求的情况下按时交付的吧.但往往都事与愿违,造成这个结果的原因有很多很多.通过这段时间做自动 ...

最新文章

  1. 【响应式Web前端设计】一文学会使用Bootstrap!
  2. 笨办法学python3.6 pdf_“笨办法”学Python3.pdf
  3. ReflectionToStringBuilder
  4. AB1601蓝牙初始化注意事项
  5. App自动化测试之Adb基础命令使用
  6. 关卡 动画 蓝图 运行_UE4入门之路(基础蓝图篇):蓝图的制作
  7. Android 跳转到ViewPager指定页面
  8. 【CodeForces - 227C】Flying Saucer Segments (思维)
  9. Failure to find com.oracle:ojdbc6:jar:11.2.0.1.0
  10. 基于zeromq的高性能分布式RPC框架Zerorpc 性能测试
  11. 拓扑排序——杂物(洛谷 P1113)
  12. 微信微订货店:品牌支持,走在同行业的前列。代理,仅仅是寻求双赢
  13. php xml构造,C++_C语言实现xml构造解析器,纯C实现xml构造解析器,所有实 - phpStudy...
  14. 1.北京理工大学Python与机器学习-绪论
  15. wind 10家庭版系统激活
  16. python创作音乐: 计算机创作,计算音乐
  17. Anaconda 修改文件保存路径
  18. Citrix 服务器虚拟化之一 网络部署Xenserver 6.2
  19. 股市跷跷板—债券基金
  20. 服务器安全管理如何实现?

热门文章

  1. python在使用pyinstaller打包文件时提示找不到指定模块
  2. html添加空隙,html空隙
  3. 滴滴打车CTO张博:我们要这样玩社区和大数据
  4. C语言的getc()和putc()函数
  5. 工会活动报名统计在微信里面_工会开发人员可以在索尼爱立信Xperia™PLAY上获得更多关注
  6. nyoj 吃土豆 234 (双层DP)
  7. DNS解析错误的问题,域名解析错误导致输入域名不访问而直接输入网站IP却可以正常访问
  8. Oracle Dataguard基于rac主库搭建rac备库
  9. 【web前端面试题整理07】我不理解表现与数据分离
  10. 如何限制局域网计算机上网,怎么样禁止局域网用户修改电脑ip地址