进入旧版 | 服务项目 | 成功案例 | 联系方式 | 过客留言 | 友情链接
   
设为首页
加入收藏
联系我们
网站首页 | 新闻资讯 | 操作系统 | 办公软件 | 网络软件 | 工具软件 | 媒体动画 | 网页制作 | 网站开发 | 程序开发 | 平面设计
Photoshop视频教程 | Word入门 | Flash入门 | JScript | VBScript | ASP | PHP | ADO | 网页特效 | 3DS MAX6.0命令 | 系统进程
您当前的位置:GOODSGY电脑学习网 -> 操作系统 -> 其他 -> 文章内容  
最强之dos命令 - for

    以前常觉得DOS的命令行功能太弱,无法象UNIX一样可以用命令行完成非常复杂的操作。实际上,当MS从WIN2K开始将命令行增强后,已经借鉴了相当多UNIX的优点,虽然还无法做到象UNIX那么灵活,但已可完成绝大多数的任务,比如用&&和  连接两个(或更多)命令,由前一个的返回值来决定下一个是否执行,等等。而在这些增强中,最明显的,就是FOR命令。 www.goodsgy.com

    举个例子,用适当的参数,可用FOR命令将 date /t 的输出 从 "Sat 07/13/2002" 变成你想要的格式,比如, "2002-07-13": www.goodsgy.com


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


    该例将在(3)中详细说明。 www.goodsgy.com

    0. 基本应用 www.goodsgy.com

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


    for %a in (c: d: e: f do @dir %a   find "bytes free" www.goodsgy.com

    将输出: www.goodsgy.com

    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 www.goodsgy.com


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


    for %a in (*.txt) do type %a www.goodsgy.com


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


    1. 可以用 /r 参数遍历整个目录树 www.goodsgy.com

    2. 可以用 /f 参数将文本文件内容作为循环范围 www.goodsgy.com

    3. 可以用 /f 参数将某一命令执行结果作为循环范围 www.goodsgy.com

    4. 可以用 %~ 操作符将文件名分离成文件名、扩展名、盘符等独立部分 www.goodsgy.com


    现分别举例说明如下: www.goodsgy.com

    1. 用 /r 遍历目录树 www.goodsgy.com

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


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


    find 前面的 @ 只是让输出结果不包括 find 命令本身。这是DOS很早就有的功能。和FOR无关。 www.goodsgy.com

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


    for /r . %a in (.) do @if exist %aCVS rd /s /q %aCVS www.goodsgy.com


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

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


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


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

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

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


    c: empa1.txt
    c: empa2.txt
    c: empsubdir3.txt
    c: empsubdir4.txt www.goodsgy.com


    那么可以用FOR来完成: www.goodsgy.com


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


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


    Volume in drive D is DATA
    Volume Serial Number is C47C-9908 www.goodsgy.com

    Directory of D: mp www.goodsgy.com

    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 www.goodsgy.com


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


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


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


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


    你将看到: www.goodsgy.com


    alg0925.txt
    bsample.txt
    invitation.txt www.goodsgy.com


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

    3. 可以用 /f 参数将某一命令执行结果作为循环范围 www.goodsgy.com

    非常有用的功能。比如,我们想知道目前的环境变量有哪些名字(我们只要名字,不要值)。可是SET命令的输出是“名字=值”的格式,现在可以用FOR来只取得名字部分: www.goodsgy.com


    FOR /F "delims==" %i IN ('set') DO @echo %i www.goodsgy.com


    将看到: www.goodsgy.com


    ALLUSERSPROFILE
    APPDATA
    CLASSPATH
    CommonProgramFiles
    COMPUTERNAME
    ComSpec
    dircmd
    HOMEDRIVE
    ...... www.goodsgy.com


    这里是将set命令执行的结果拿来作为循环范围。delims==表示用=作为分隔符,由于FOR /F默认是用每行第一个TOKEN,所以可以分离出变量名。如果是想仅列出值: www.goodsgy.com


    FOR /F "delims== tokens=2" %i IN ('set') DO @echo %i www.goodsgy.com


    tokens=2和前例相同,表示将第二列(由=作为分隔符)作为循环值。 www.goodsgy.com

    再来个更有用的例子: www.goodsgy.com

    我们知道 date /t (/t表示不要询问用户输入)的输出是象这样的: www.goodsgy.com


    Sat 07/13/2002 www.goodsgy.com


    现在我想分离出日期部分,也就是13: www.goodsgy.com


    for /f "tokens=3 delims=/ " %a in ('date /t') do @echo %a www.goodsgy.com


    实际上把 tokens后面换成1,2,3或4,你将分别得到Sat, 07, 13和2002。注意delims=/后面还有个空格,表示/和空格都是分隔符。由于这个空格delims必须是/f选项的最后一项。   www.goodsgy.com

    再灵活一点,象本文开头提到的,将日期用2002-07-13的格式输出: www.goodsgy.com


    for /f "tokens=2,3,4 delims=/ " %a in ('date /t') do @echo %c-%a-%b www.goodsgy.com


    当tokens后跟多个值时,将分别映射到%a, %b, %c等。实际上跟你指定的变量有关,如果你指定的是 %i, 它们就会用%i, %j, %k等。 www.goodsgy.com

    灵活应用这一点,几乎没有做不了的事。 www.goodsgy.com

    4. 可以用 %~ 操作符将文件名分离成文件名、扩展名、盘符等独立部分 www.goodsgy.com

    这个比较简单,就是说将循环变量的值自动分离成只要文件名,只要扩展名,或只要盘符等等。 www.goodsgy.com

    例:要将 c:mp3下所有mp3的歌名列出,如果用一般的 dir /b/s 或 for /r ,将会是这样: www.goodsgy.com


    g:mp3Archived-18-01-A游鸿明-下沙游鸿明-01 下沙.mp3
    g:mp3Archived-18-01-A游鸿明-下沙游鸿明-02 21个人.mp3
    ......
    g:mp3Archived-18-01-A王菲-寓言王菲-阿修罗.mp3
    g:mp3Archived-18-01-A王菲-寓言王菲-彼岸花.mp3
    g:mp3Archived-18-01-A王菲-寓言王菲-不爱我的我不爱.mp3
    ...... www.goodsgy.com


    如果我只要歌名(不要路径和".mp3"): www.goodsgy.com


    游鸿明-01 下沙
    游鸿明-02 21个人
    ......
    王菲-阿修罗
    王菲-彼岸花
    王菲-不爱我的我不爱
    ...... www.goodsgy.com


    那么可以用FOR命令: www.goodsgy.com


    for /r g:mp3 %a in (*.mp3) do @echo %~na www.goodsgy.com


    凡是 %~ 开头的操作符,都是文件名的分离操作。具体请看 for /? 帮助。 www.goodsgy.com

    本文举的例子有些可能没有实际用处,或可用其它办法完成。仅用于体现FOR可以不借助其它工具,仅用DOS命令组合,就可完成相当灵活的任务。www.goodsgy.com

在百度中搜索:最强之dos命令 - for
在Google中搜索:最强之dos命令 - for
在Yahoo中搜索:最强之dos命令 - for

收藏到网摘:新浪VIVI 365key 我摘 POCO网摘 博采中心 YouNote 和讯网摘 天天收藏
[] [返回上一页] [打 印] [收 藏]

 相关文章    最新文章
· [组图] 史上最强网络相册Flickr完全玩转攻..
· [组图] 用save for web优化网页图象
· [图文] 体验史上最强的Photoshop CS
· 史上最强QQ个人档案资料欣赏(上)
· 史上最强QQ个人档案资料欣赏(下)
· 为非主流主机优化 打造最强Vista 5456
· C++:最强大的.NET语言之装箱
· 扩展 IronPython for ASP.NET:编写自定义..
· 如何将gd编译进php for Linux. gd版本1.6..
· cqlctpl php模板开始提供,最好用,功能最..
 
· Vista下个版本Windows 7命名的来历
· 浅谈PDF文档的搜索引擎优化方法
· 菜鸟入门 字节与位的区别及联系
· 主板BIOS出错提示详解
· Sun发布Solaris 10 5/08操作系统
· 轻松解决:NTFS和FAT32互相转化问题
· 大容量硬盘分区窍门:合理分区技巧
· Windows 7中加入“绿色P2P”技术
· 我的软考经验 希望能助你取得成功
· 硬盘分区遵循的七大分区原则

∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论…]
站内搜索

精彩图文
  网站导航  
操作系统 办公软件 网络软件
Vista Windows2003 WindowsXP Windows2000/NT Windows9X/ME Linux 其他 Word Excel Powerpoint Outlook 金山系列 其他 网页浏览 上传下载 联络聊天 邮件工具 服务器软件 网络辅助
工具软件 媒体动画 网页制作
系统工具 媒体工具 压缩工具 图文处理 文件管理 其他 3DMAX Authorware Director Maya 视频处理 其他 Flash Dreamweaver FireWorks FrontPage LiveMotion Golive HTML/CSS 其它
网站开发 平面设计 程序设计
ASP JSP PHP CGI JavaScript VBScript XML/SOAP Web服务器 Photoshop PhotoImpact CorelDraw Illustrator Freehand 设计欣赏 其他 VB VC .NET C/C++ DELPHI JAVA

冀ICP备05019428号
Copyright © 2004-2008 电脑学习网 Inc.All rights reserved.
TEL:13832340607
QQ:39873155
E_Mail:goodsgy(#)hotmail.com   (把(#)替换成@)
MSN:goodsgy(#)hotmail.com   (把(#)替换成@)