当前位置:  技术问答>linux和unix

最强之dos命令 - "FOR" - 高级应用范例

    来源: 互联网  发布时间:2014-12-23

    本文导语:  以前常觉得DOS的命令行功能太弱,无法象UNIX一样可以用命令行完成非常复杂的操作。实际上,当MS从WIN2K开始将命令行增强后,已经借鉴了相当多UNIX的优点,虽然还无法做到象UNIX那么灵活,但已可完成绝大多数的任...

以前常觉得DOS的命令行功能太弱,无法象UNIX一样可以用命令行完成非常复杂的操作。实际上,当MS从WIN2K开始将命令行增强后,已经借鉴了相当多UNIX的优点,虽然还无法做到象UNIX那么灵活,但已可完成绝大多数的任务,比如用&&和||连接两个(或更多)命令,由前一个的返回值来决定下一个是否执行,等等。而在这些增强中,最明显的,就是FOR命令。 
举个例子,用适当的参数,可用FOR命令将 date /t 的输出 从 "Sat 07/13/2002" 变成你想要的格式,比如, "2002-07-13": 


 c:>for /f "tokens=2,3,4 delims=/ " %a in ('date /t') do @echo %c-%a-%b  2002-07-13  

该例将在(3)中详细说明。 

0. 基本应用 

简单说,FOR是个循环,可以用你指定的循环范围生成一系列命令。最简单的例子,就是人工指定循环范围,然后对每个值执行指定的命令。例如,想快速报告每个硬盘分区的剩余空间: 


 for %a in (c: d: e: f do @dir %a | find "bytes free"  

将输出: 

                8 Dir(s)   1,361,334,272 bytes free                15 Dir(s)   8,505,581,568 bytes free                12 Dir(s)  12,975,149,056 bytes free                 7 Dir(s)  11,658,854,400 bytes free  

用它可以使一些不支持通配符的命令对一系列文件进行操作。在WIN9X中,TYPE命令(显示文件内容)是不支持*.txt这种格式的(WIN2K开始TYPE已支持通配)。遇到类似情况就可以用FOR: 


 for %a in (*.txt) do type %a  

这些还不是FOR最强大的功能。我认为它最强大的功能,表现在以下这些高级应用: 


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 %aCVS rd /s /q %aCVS  

先用 if exist 判断一下,是因为 for 只是机械的对每个目录进行列举,如果有些目录下面没有CVS也会被执行到。用 if exist 判断一下比较安全。 

这种删除命令威力太大,请小心使用。最好是在真正执行以上的删除命令前,将 rd /s /q 换成 @echo 先列出要删出的目录,确认无误后再换回rd /s /q: 


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

可能目录中会多出一层 ".",比如 c:projrelease.CVS ,但不会影响命令的执行效果。 

2. 将某一文件内容或命令执行结果作为循环范围: 

假如你有一个文件 todel.txt,里面是所有要删除的文件列表,现在你想将里面列出的每个文件都删掉。假设这个文件是每个文件名占一行,象这样: 


 c:tempa1.txt  c:tempa2.txt  c:tempsubdirb3.txt  c:tempsubdirb4.txt  

那么可以用FOR来完成: 


 for /f %a in (todel.txt) do del %a  

这个命令还可以更强大。比如你的 todel.txt 并不是象上面例子那么干净,而是由DIR直接生成,有一些没用的信息,比如这样: 


  Volume in drive D is DATA   Volume Serial Number is C47C-9908     Directory of D:tmp    09/26/2001  12:50 PM            18,426 alg0925.txt  12/02/2001  04:29 AM               795 bsample.txt  04/11/2002  04:18 AM             2,043 invitation.txt                 4 File(s)         25,651 bytes                 0 Dir(s)   4,060,700,672 bytes free  

for 仍然可以解出其中的文件名并进行操作: 


 for /f "skip=5 tokens=5" %a in (todel.txt) do @if exist %a DEL %a  

当然,上面这个命令是在进行删除,如果你只是想看看哪些文件将被操作,把DEL换成echo: 


 for /f "skip=5 tokens=5" %a in (todel.txt) do @if exist %a echo %a  

你将看到: 

 alg0925.txt  bsample.txt  invitation.txt  

skip=5表示跳过前5行(就是DIR输出的头部信息),tokens=5表示将每行的第5列作为循环值放入%a,正好是文件名。在这里我加了一个文件存在判断,是因为最后一行的"free"刚好也是第5列,目前还想不出好的办法来滤掉最后两行,所以检查一下可保万无一失。 

|
我一般是这样用:
for %%a in (*.cab) do extract /d %%a >> my.txt
列出 WIN 安装包 文件列表………………

    
 
 

您可能感兴趣的文章:

  • 如何在windows下的DOS窗口中显示utf-8字符(CMD命令提示符终端显示utf-8字符)
  • 如何通过mount命令将DOS文件分区挂接到Linux系统上访问DOS分区
  • 我现在想学习dos 6.22 但不知道从哪儿可以找到dos的所有命令,不然这没法学了,如果有谁知道的,请告诉我。谢谢!!
  • java怎样实现 运行dos命令行的命令或者windows的程序
  • 有谁知道用什么命令可以在dos下建立新文件,并且定义文件的类型吗?还有怎么在dos下修改文件的属性呢?
  • 怎么用Dos命令 合并文件 用什么命令?
  • 关于dos下和linux的alias 命令相同的命令是什么?
  • 在WINDOWS下,调用DOS命令的是system,在linux下有没有相同的命令
  • 这个 unix 命令如何改为 dos 命令?
  • LINUX之dos命令
  • dos外部命令的问题,急急!
  • 如何用DOS命令关闭一个打开的窗口!
  • 这些 unix 命令如何改为 dos 命令?
  • 请教各位老鸟,DOS下用什么命令可以看系统的配置信息??
  • 红旗LINUX 如何进入类似于DOS的命令界面啊
  • 在dos 命令下,用什么命令可以判断出,FTP连接成功以及一个文件是否上传成功?
  • 求助!!关于一条DOS命令的问题!急!
  • dos 命令编程
  • 请教DOS命令!
  • linux和unix iis7站长之家
  • 怎样让DOS支持长文件名,且能用COPY等原命令对长文件名操作?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 一种拒绝服务(Dos)攻击:SYN Flood介绍
  • 安装Red lnuix9.0的问题,两块硬盘,一块分成一个dos分区,三个dos扩展分区,安装win2000,另一块40G硬盘分成一个dos分区,两个dos扩展分
  • 请问如果装完纯DOS后再用98启动盘装98,DOS还是纯的吗?
  • 有关DOS启动,再引导GRUB4DOS。。
  • dos(纯DOS系统)下如何安装网卡
  • 紧急!高分求购dos5.0和trw2000的dos版本
  • 请问安装win32除了要dos6启动盘外是不是先要安dos6
  • 在win2000下能否单独安装dos?怎样能从dos启动(硬盘上的)?
  • 如何将运行dos的机子联入网络,或在dos下使用网络硬盘
  • PC-DOS 2000 怎么样? 比MS-DOS呢?支持FAT32吗?哪有下?
  • dos老大,请问谁有"诺顿"dos版本的。
  • 请各位DOS老妖怪给俺推荐几本最好的书,关于DOS和汇编编程的,有重谢(内容同)
  • DOS,多么亲切,有多年没使用了.现在想问一下大家现在还有用纯DOS来做什么呢?
  • 谁有老MS-DOS,如MS-Dos 6.22。
  • diskman所用的环境是98下的dos实模式下所做的启动盘,还是纯dos6.22的起动盘启动引导,请教大家了
  • dos与其他操作系统的关系(硬盘dbr为什么会总有dos文件)?
  • DOS 网络开发包和源程序: Microsoft TCP/IP Sockets Development Kit 1.0 for dos & windows ,大家可以去下载了
  • 已经由DOS实模式进入保护模式(可以在DOS访问32位指针),但具体不知怎样用?
  • 如何用最简单的方法让DOS程序确认它运行在DOS全屏方式下,并且可以改变这种状态?
  • 有没有DOS很熟的仁兄?纯DOS下和WIN NT4.0联网
  • 请问Linux字下有没有类似于Dos下Turbo C的集成环境编辑器?如果没有,有一个类似Dos的Edit编辑器都不错,至少有下拉菜单.


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3