学会爱,也学会批处理 第四章
可以说,批处理脚本中最重要的几个命令我都没有给出如echo或if那样比较详细的介绍,原因我已经说了,因为我也是个菜,我也不太懂----但我正在学!你呢?今天又去了一趟图书馆,淘金一样发现了一本叫《DOS批文件》的东东,藏在一个角落里落满了灰,五本摞一起就跟砖头一样厚了。大概翻了一下,里面介绍了很多比较底层和基础的东西,虽然从思路上讲,已经有点time out了,很多东西已经基本没有利用的价值(这就是信息时代的更新速度),但还是很值得看的。于是打算下午淘过来,放假回去了再好好研究一番,连同那几个不熟悉的命令一起搞熟了,再续写这篇教程。我始终坚信,没有最好只有更好。
但是很可惜,等到下午再去的时候,图书馆楼梯口已经立了一个牌子,上面写着out of service----人家这学期的工作结束了。于是回到宿舍打算继续写第四章,正在这时又得到一个“振奋人心”的消息:期末考试有一科挂了,而且是全班第一----这一门整个班里就挂了我一个。郁闷的情绪刹那间涌上心头,整个世界仿佛都变成黑的了。食堂和小卖部已经陆续关门,学校里的人越来越少,迎面过来的几个同学也都一身行李,忙碌着准备回家过年,内心的孤寂和失落如同夏日里暴雨前的乌云,迅速而不可抗拒的占领了心里每一个角落。迎着一月的冷风我一个人在天桥上发呆,还能怎么样,连期末考试都应付不了的失败男人。
“课间休息”时间好象长了点,呵呵,上课了!从这一章开始,将详细介绍批处理中常用的几个组合命令和管道命令。这些命令虽然不是必须的,如同爱一个人时不一定非得每天去陪,但如果少了这个过程,事情就会变的复杂而不完美,所以我认为管道命令和组合命令是批处理的调味剂,几乎是少不了的。
下面从管道命令讲起。常用的管道命令有以下这些:|、>、>>
11、|
这个命令恐怕大家不是很陌生,经常操作DOS的朋友都应该知道,当我们查看一个命令的帮助时,如果帮助信息比较长,一屏幕显示不完时DOS并不给我们时间让我们看完一屏幕再翻到另一屏幕,而是直接显示到帮助信息的最后。如在提示符下输入help回车时,就会看到当前DOS版本所支持的所有非隐含命令,但你只能看到最后的那些命令,前面的早就一闪而过了,如何解决这个问题?看例十三:
help | more
回车后会发现显示满一屏幕后就自动暂停,等候继续显示其他信息。当按写回车时,变成一个一个的出现;按下空格键时一屏幕一屏幕显示,直到全部显示完为止;按其他键自动停止返回DOS。
为什么会出现上述现象?答案很简单,这里结合了管道命令|和DOS命令more来共同达到目的的。这里先简单介绍一下help命令和more命令,对理解|命令的用法有很大帮助。
11.1、help命令。其实这个命令是不需要多说的,但在上述例子中help命令的用法比较特殊,直接在DOS提示符下输入help命令,结果是让DOS显示其所支持的所有非隐含命令,而在其他地方用help命令,如输入net help回车,则是显示net命令的帮助信息。
11.2、more命令。可能很多朋友以前就没有接触过这个命令,这个命令在Linux下的用处非常广泛,也是管道命令之一。大家可以找一篇比较长的文章(a.txt)在DOS提示符下输入如下两个命令去比较一下差别:more a.txt和type a.txt。利用more命令,可以达到逐屏或逐行显示输出的效果,而type命令只能一次把输出显示完,最后的结果就是只能看到末尾的部分。在例十三里,more命令的作用就是让输出的信息逐屏或逐行显示。
看到这里,你是否已经能隐约感受到了|命令的作用了?没错,它的作用,就是把前一命令的输出当后一命令的输入来用的。在例十三里,前一命令的输出,就是help命令执行后显示的DOS所支持的所有非隐含命令,而这个结果刚好做了后一命令more的输入。所以例十三和下面的例十四是等效的:
help > a.txt
more a.txt
del a.txt
这里利用另一管道命令>生成了一个a.txt文件作为中间环节,在用more命令查看a.txt文件后再删除a.txt文件(例十三的所有操作是在内存中进行的,不生成文件)。可以看出,正确使用管道命令|可以带来事半功倍的效果。
结合例十三和例十四,以及前面的例九再体会一遍:|命令的作用,就是让前一命令的输出当做后一命令的输入。
12、>、>>
这两个命令的效果从本质上来说都是一样的,他们都是输出重定向命令,说的通俗一点,就是把前面命令的输出写入到一个文件中。这两个命令的唯一区别是,>会清除掉原有文件中的内容后把新的内容写入原文件,而>>只会另起一行追加新的内容到原文件中,而不会改动其中的原有内容。例十五:
echo @echo off > a.bat
echo echo This is a pipeline command example. >> a.bat
echo echo Is it easy? >> a.bat
echo echo Believe your self! >> a.bat
echo pause >> a.bat
echo exit >> a.bat
依次在DOS提示符下输入以上各行命令,一行一个回车,将在当前目录下生成一个a.bat文件,里面的内容如下:
@echo off
echo This is a pipeline command example.
echo Is it easy?
echo Believe your self!
pause
exit
看到这里,你得到了多少信息?1、可以直接在DOS提示符下利用echo命令的写入功能编辑一个文本,而不需要专门的文本编辑工具;2、管道命令>和>>的区别如上所述。如果这里只用>命令来完成上面操作,最后也会生成一个a.bat,但里面的内容就只剩下最后一行exit了。所以>和>>一般都联合起来用,除非你重定向的输出只有一行,那么就可以只用>了。结合例一再仔细体会输出重定向管道命令>和>>的用法。
13、<、>&、<&
这三个命令也是管道命令,但它们一般不常用,你只需要知道一下就ok了,当然如果想仔细研究的话,可以自己查一下资料。
<,输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。
>&,将一个句柄的输出写入到另一个句柄的输入中。
<&,刚好和>&相反,从一个句柄读取输入并将其写入到另一个句柄输出中。
关于这三个管道命令的举例,在后面批处理脚本的精妙应用中还将涉及到。
下面介绍组合命令:&、&&、||
组合命令,顾名思义,就是可以把多个命令组合起来当一个命令来执行。这在批处理脚本里是允许的,而且用的非常广泛。它的格式很简单----既然现在已经成了一个文件了,那么这多个命令就要用这些组合命令连接起来放在同一行----因为批处理认行不认命令数目。组合命令的作用,就如同给爱人陪不是,说一句是说,说十句也是说,不一次把好话都说了出来,效果可能会好些----当然得排除一种特殊情况:这些话是否有先后顺序,有些话是否可以同时说。在批处理脚本里也一样,有些时候某些命令是不能同时执行的,后面给你说。
刚刚又送走了一个同学,人去楼空的感觉越来越明显,望着空荡荡的床铺,平日里喧闹的宿舍就只剩下我一个人了,整个世界只有那个平时令人非常讨厌的老鼠这时候才显得可爱起来----只有它会陪着我在这不敢开灯的漆黑夜里----一个连期末考试都应付不了的失败男人。失败!我感到快要呼吸不过来,这种失败的压力简直令我窒息,简直让我的手接收不到大脑的信号,简直让这篇未完成的教程夭折。但我能怪谁?
忙碌了一学期要过年了却挂了科,失败;挂了科也倒罢了,竟然一个人拖全班的后退,失败中的失败;更失败的,是在这最失落的时候,竟然找不到一个人可以倾诉;然而最失败的,是突然发现自己竟然如此脆弱,如此耐不住寂寞。不过这倒也解开了心中疑惑很久的一个问题:为什么明知道那段情是一个旋涡却还心甘情愿的往里面跳----这就是青春,风一样的年龄,火一样不安的心。不再爱了,我不要再一个人的时候苦苦等待;不再爱了,我不要在你给的囚笼里怜悯的爱;不再爱了,我不要在别人的视线里如此可笑;不再爱,我不再爱。就算塌下来,我也要一个人扛着,头不能低腰不能弯,不能喘息不能倾诉,因为虽然失败,但还是男人,是男人就不能向困难低头!
14、&
这可以说是最简单的一个组合命令了,它的作用是用来连接n个DOS命令,并把这些命令按顺序执行,而不管是否有命令执行失败。例十六:
copy a.txt b.txt /y & del a.txt
其实这句和move a.txt b.txt的效果是一样的,只不过前者是分了两步来进行的(在后面还将涉及到具体使用哪种方法的问题)。这个命令很简单,就不多费口舌了,唯一需要注意的一点是,这里&两边的命令是有执行顺序的,从前往后执行。
15、&&
切记,这里介绍的几个命令都是组合命令,所以他们前后都必须都有其他命令(要不如何组合?)。这个命令也不例外,它可以把它前后两个命令组合起来当一个命令来用,与&命令不同之处在于,它在从前往后依次执行被它连接的几个命令时会自动判断是否有某个命令执行出错,一旦发现出错后将不继续执行后面剩下的命令。这就为我们自动化完成一些任务提供了方便。例十七:
dir file://1%/www/user.mdb && copy file://1%/www/user.mdb e:\backup\www
如果远程主机存在user.mdb,则copy到本地e:\backup\www,如果不存在当然就不执行copy了。这句对搞网管的朋友是否有点用呢?呵呵。其实它和下面这句的作用是一样的:
if exist file://1%/www/user.mdb copy file://1%/www/user.mdb e:\backup\www
至于你喜欢用哪个就随便了,我没办法判断dir和if两个命令哪一个执行效率更高,所以不知道用哪个更好,呵呵。
你是否还记得“有些命令是不能同时执行的”?你是否相信这句话?当然得相信,不信就给你出道题:把C盘和D盘的文件和文件夹列出到a.txt文件中。你将如何来搞定这道题?有朋友说,这还不是很easy的问题吗?同时执行两个dir,然后把得到的结果>到a.txt里就ok了嘛,看例十八:
dir c:\ && dir d:\ > a.txt
仔细研究一下这句执行后的结果,看看是否能达到题目的要求!错了!这样执行后a.txt里只有D盘的信息!为什么?就因为这里&&命令和>命令不能同时出现一个句子里(批处理把一行看成一个句子)!!组合命令&&的优先级没有管道命令>的优先级高(自己总结的,不妥的地方请指正)!所以这句在执行时将本分成这两部分:dir c:\和dir d:\ > a.txt,而并不是如你想的这两部分:dir c:\ && dir d:\和> a.txt。要使用组合命令&&达到题目的要求,必须得这么写:
dir c:\ > a.txt && dir d:\ >> a.txt
这样,依据优先级高低,DOS将把这句话分成以下两部分:dir c:\ > a.txt和dir d:\ >> a.txt。例十八中的几句的差别比较特殊,值得好好研究体会一下。
当然这里还可以利用&命令(自己想一下道理哦):
dir c:\ > a.txt & dir d:\ >> a.txt
16、||
这个命令的用法和&&几乎一样,但作用刚好和它相反:利用这种方法在执行多条命令时,当遇到一个执行正确的命令就退出此命令组合,不再继续执行下面的命令。题目:查看当前目录下是否有以s开头的exe文件,如果有则退出。例十九:
@echo off
dir s*.exe || exit
其实这个例子是有破绽的,你看出来了吗?其实很简单,自己试试就知道了嘛:如果存在那个exe文件,就退出;如果不存在那个exe文件,也退出!为什么?因为如果不存在那个.exe文件,则前一条命令dir s*.exe执行肯定是不成功的,所以就继续执行exit,自然就退出了,呵呵。那么如何解决题目给出的问题呢?看例二十:
@echo off
dir s*.exe || echo Didn't exist file s*.exe & pause & exit
这样执行的结果,就能达到题目的要求,是否存在s*.exe将出现两种结果。这里加暂停的意思,当然是让你能看到echo输出的内容,否则一闪而过的窗口,echo就白写了。
给出两个更好研究优先级(同时也是更难理解)的脚本,仔细研究它们的区别,以便彻底理解各种命令的优先级顺序,对以后自己利用这些命令写脚本有很大的好处----不会出错!OK,请看例二十一和例二十二:
例二十一:
@echo off
dir a.ttt /a & dir a.txt || exit
例二十二:
@echo off
dir a.ttt /a && dir a.txt || exit
警告:患有心脑血管病的朋友请不要研究以上两例,否则轻者头大如斗,重者血管爆裂。任何人由于研究这两个脚本的区别而造成的任何事故由自己或其合法监护人负责,与本人和本论坛无关。特此警告!
有关管道命令和组合命令就大概介绍到这里了,不知道聪明的你是否理解?呵呵,能理解就成天才了,除非你以前就已经掌握!千万别小看了这几个鬼命令,shit,简直就不是人学的东西!但我还是静下心来研究了一番,最后得出的结论如上所述,已经一点不剩的交给你了,希望你好好收藏并消化吸收,当然有错误被你发现了,或者不完整的地方被你看出来了,请赶紧告诉我一声!
这几个命令真的把我的头都搞大了。在网上有一篇流传很广的批处理教程:“简明批处理教程”,虽然说的比较全面,但看起来很不过瘾。在对for等命令介绍时,除了列举出一个和ipc入侵有关的例子,就一个for /? > a.txt & start a.txt完事了(当然这一点上我不能说人家什么,毕竟我连for /?都没给出),而对上述管道命令和组合命令、以及这篇教程以后将讲到的用批处理操作注册表等方面根本没有介绍。我之所以花整整一章来讲管道命令和组合命令,是因为他们才是批处理的精华和灵魂,能否正确利用好这几个命令,是能否掌握批处理的前提条件。如for、set等DOS命令的问题,可以从DOS的角度出发专门有针对性的学习,但有关这几个命令的问题,却是不容易精通掌握的----他们之间的关系太复杂了!
看了一下第三章的“天气预报”,发现这一章中还要讲批处理中参数的使用,唉,真不想活了。批处理中的参数使用,又是一块重点和难点!千万别小看那个破参数,利用它你可以做很多。本打算一鼓作气写完,但是很可惜,今天心情太糟糕----实在是前所未有的糟,能写完上面这几个烦死人的符号,我就已经开始佩服自己的忍耐能力了。在10点多的夜晚,我还饿着肚子忍着性子来写这些都不知道有没有人看肯定的东西,傻B了我。看来今天是完不成任务了,而明天又没时间写,看来只好等到回家后再继续了。那么这一章的内容也就只好写到这里,参数的问题放到下一章吧。
离停电还有17分钟了,晚上陪我一起过夜的那个小老鼠还没有出现,甚至床底下连点动静都没有,是不是它也回家了?一个人的世界,原来也这么凄凉!一个人到底能承受多大的挫折和打击,恐怕和力学中的破坏性实验差不多,等到有了结果的时候,工件也就报废了。所以我不想成为这种挫折和打击的实验品----起码在并不美好的青春里,我还是前进着的。
天气预报:
下一章中先补充一下这一章漏掉的批处理脚本中参数的使用,然后介绍如何利用批处理操作注册表,以及批处理的综合应用;第六章将介绍批处理在病毒、网络安全以及其他方面的应用。也许还有第七章第八章甚至更多,因为学无止境的道理大家都懂,但我怕到时候会写不下去,天资有限也是一件很无奈的事情。但我会尽力的。
找了好久第四章,却听说红色代码已将版权出售,我又找不到出版的期刊,不曾想竟在着看到,感激ing.......