当前位置: 首页 > 图文教程 > 操作系统 > DOS > 最强之dos命令 - for

DOS
Windows系统蓝屏死机代码大揭秘(三)
Windows系统蓝屏死机代码大揭秘(四)
操作系统优化中的重要环节
巧设虚拟内存让系统更流畅
Win 98系统中共享文件夹和打印机
老系统如何实现自动关机
让Windows只显示某些文件的扩展名
对于Win 98系统死机的简单预防
热门技巧天天递招 98篇(九)
热门技巧天天递招 98篇(十)
热门技巧天天递招 98篇(十一)
热门技巧天天递招 98篇(十二)
热门技巧天天递招 98篇(十三)
热门技巧天天递招 98篇(十四)
热门技巧天天递招 98篇(十五)
热门技巧天天递招 98篇(十六)
热门技巧天天递招 98篇(十七)
热门技巧天天递招 98篇(十八)
热门技巧天天递招 98篇(十九)
热门技巧天天递招 98篇(二十)

DOS 中的 最强之dos命令 - for


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-01   浏览: 39 ::
收藏到网摘: n/a

    以前常觉得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:proj elease.CVS ,但不会影响命令的执行效果。

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

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


    c: empa1.txt
    c: empa2.txt
    c: empsubdir3.txt
    c: empsubdir4.txt


    那么可以用FOR来完成:


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


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


    V