这是一篇技能教程,我会用很大略的笔墨表达清楚自己的意思,你要你识字就能看懂,就能学到知识。写这篇教程的目的,是让每一个看过这些笔墨的朋友记住一句话:如果爱可以让事情变的更大略,那么就让它大略吧!
看这篇教程的方法,便是慢!
逐步的,犹如品一个女人、一杯茗茶,你会创造很多以前就在面前的东西溘然变的很迢遥,而有些很迢遥的东西却又溘然回到了面前。先概述一下批处理是个什么东东。批处理的定义,至今我也没能给出一个得当的----浩瀚高手们也都没给出----反正我不知道----看了我也不一定信服----我是个菜鸟,当然就更不用说了;但我想总结出一个“比较得当的”,而且我也相信自己可以把它阐明的很清楚,让更多的菜鸟都知道这是个什么东东,你用这个东东可以干什么事情。或许你会由于这篇文章而“无条件爱上批处理”,那么我的目的就达到了----我便是要让你爱上它,我就这么拽,你能怎么着??真的,爱有时候就这么拽,便是这么没情由,便是这么不要脸!
真的!
按照我的理解,批处理的实质,是一堆DOS命令按一定顺序排列而形成的凑集。OK,never claver and get to business(闲话少说言归正传)。批处理,也称为批处理脚本,英文译为BATCH,批处理文件后缀BAT就取的前三个字母。它的构成没有固定格式,只要遵守以下这条就ok了:每一行可视为一个命令,每个命令里可以含多条子命令,从第一行开始实行,直到末了一行结束,它运行的平台是DOS。批处理有一个很光鲜的特点:利用方便、灵巧,功能强大,自动化程度高。我不想让自己写的教程呆板无味,由于牵缠到代码(批处理的内容算是代码吧?)的问题本来便是呆板的,很少有人能面对满屏幕的代码而静下心来。以是我会用很多大略实用的例子让读这篇教程的朋友去体会批处理的那四射的魅力,感想熏染它那古灵精怪的性情,不知不觉中爱上批处理(晕,怎么又是爱?到底批处理和爱有什么关系?答案:没有!
)。再说句“闲话”:要学好批处理,DOS根本一定要牢!
当然脑筋灵巧也是很主要的一方面。例一、先给出一个最easy的批处理脚本让大家和它混个脸熟,将下面的几行命令保存为name.bat然后实行(往后文中只给出代码,保存和实行办法类似):ping sz.tencent.com > a.txtping sz1.tencent.com >> a.txtping sz2.tencent.com >> a.txtping sz3.tencent.com >> a.txtping sz4.tencent.com >> a.txtping sz5.tencent.com >> a.txtping sz6.tencent.com >> a.txtping sz7.tencent.com >> a.txtexit是不是都能看的懂?是不是很easy?但它的浸染却是很实用的,实行这个批处理后,可以在你确当前盘建立一个名为a.txt的文件,它里面记录的信息可以帮助你迅速找到速率最快的QQ做事器,从而阔别“从做事器中转”那一痛楚的过程。这里>的意思,是把前面命令得到的东西放到后面所给的地方,>>的浸染,和>的相同,差异是把结果追加到前一行得出的结果的后面,详细的说是下一行,而前面一行命令得出的结果将保留,这样可以使这个a.txt文件越来越大(想到如何搞毁坏了??)。By the way,这个批处理还可以和其他命令结合,搞成完备自动化判断做事器速率的东东,实行后直接显示速率最快的做事器IP,是不是很爽?后面还将详细先容。例二、再给出一个已经由时的例子(a.bat):@echo offif exist C:\Progra~1\Tencent\AD\.gif del C:\Progra~1\Tencent\AD\.gifa.bat为什么说这是个过期的例子呢?很大略,由于现在已经险些没有人用带广告的QQ了(KAO,我的QQ还显示好友三围呢!
!
),以是它险些用不上了。但曾经它的浸染是不可小窥的:删除QQ的广告,让对话框干干净净。这里用的地址是QQ的默认安装地址,默认批处理文件名为a.bat,你当然可以根据情形自行修正。在这个脚本中利用了if命令,使得它可以达到应时判断和删除广告图片的效果,你只须要不关闭命令实行后的DOS窗口,不按CTRL+C强行终止命令,它就一贯监视是否有广告图片(QQ也再不断查看自己的广告是否被删除)。当然这个脚本占用你一点点内存,呵呵。例三,利用批处理脚本查是否中冰河。脚本内容如下:@echo offnetstat -a -n > a.txttype a.txt | find "7626" && echo "Congratulations! You have infected GLACIER!"del a.txt pause & exit这里利用了netstat命令,检讨所有的网络端口状态,只须要你清楚常见木马所利用的端口,就能很easy的判断出来是否被人种了冰河。然这不是确定的,由于冰河默认的端口7626,完备可以被人修正。这里先容的只是方法和思路。这里先容的是方法和思路稍做改动,就变成可以检讨其他木马的脚本了,再改动一下,加进去参数和端口及信息列表文件后,就变成自动检测所有木马的脚本了。呵呵,是不是很过瘾?脚本中还利用了组合命令&&和管道命令|,后面将详细先容。例四,借批处理自动打消系统垃圾,脚本如下:@echo offif exist c:\windows\temp\. del c:\windows\temp\. if exist c:\windows\Tempor~1\. del c:\windows\Tempor~1\. if exist c:\windows\History\. del c:\windows\History\. if exist c:\windows\recent\. del c:\windows\recent\. 将以上脚本内容保存到autoexec.bat里,每次开机时就把系统垃圾给自动删除了。这里须要把稳两点:一、DOS不支持长文件名,以是就涌现了Tempor~1这个东东;二、可根据自己的实际情形进行改动,使其符合自己的哀求。怎么样,看到这里,你对批处理脚本是不是已经有点兴趣了?是不是创造自己已经逐步爱上了这个东东?别高兴的太早,爱不是一件大略的事,它大概能带给你快乐和幸福,当然也能让你痛楚的想去跳楼。如果你知道很难还敢连续的话,I服了 YOU!
连续努力吧,大概到末了你不一定得到真爱(真的有这可能,爱过的人都知道),但你可以体会到全体爱的过程,便是如此。酸、苦和辣,有没有甜天知道。为什么会把批处理和爱情扯上关系?不是我无聊,也不是由于这样写有趣多少,缘故原由有二:其一,批处理和爱情有很多相同的地方,有些地方我用“专业”的行话阐明不清(我不疑惑自己的表达能力,而是事情本身就不好说清楚),说了=没说,但用地球人都知道的爱情一比喻(爱情是什么?我怎么知道!
!
),没准你心里一下就亮堂了,事半功倍,何乐而不为?其二,我这段韶光状态不是很好,感冒发热头疼鼻塞,但紧张还是感情上精神摧残,搞的人烦透了,借写教程之际感慨几句,大家就全当买狗皮膏药了,完备可以省略不看(大概还真有点效果----不至于让你看着看着就睡着了,把头磕了来找我报销医药费)。说不定下次的教程中大家还会看到杨过、张无忌等金老前辈笔下的英雄们。看过第一章的朋友,一定对批处理有了初步的印象,知道它到底是用来干什么的了。但你知道利用批处理的精髓在哪里吗?实在很大略:思路要灵巧!
没有做不到的,只有想不到的。这和爱情就有点不同了,由于爱情的天下是两个人的天下,一厢宁愿不叫爱情(补充:那叫单恋。废话!
)而批处理却是一个人的天国,你可以为所欲为,没有达不到的境界!
批处理看起来凌乱无章,但它的逻辑性之强,绝对不比其他程序措辞(如汇编)低,如果你写的脚本是一堆乱麻,虽然每一行命令都精确,但从头实行到尾后,不一定得到你想要的结果,大概是一屏幕的Bad command or fail name。这又和爱情有了共同点:按步骤来经营,短缺或增多的步骤都可能导致不想瞥见的结果。陷入爱河的朋友,相信没有不肯定这句话的。我的爱情批处理,输出的结果不是Bad command or fail name,屏幕是这么显示的:‘你的爱情’不是内部或外部命令,也不是可运行的程序或批处理文件。然后便是光标一直闪动,等待这下一次缺点的输入。从这一章开始,将由浅入深的先容批处理中常用的命令,很多常见DOS命令在批处理脚本中有这广泛的运用,它们是批处理脚本的BODY部分,但批处理比DOS更灵巧多样,更具备自动化。要学好批处理,DOS一定要有比较踏实的根本。这里只讲述一些比较少用(相对来说)的DOS命令,常用命令如COPY、DIR等就不做先容了(这些看似大略的命令实际繁芜的很,我怕自己都说不清楚!
)。例五,先看一个实例。这是一个很故意思的脚本,一个小巧实用的好东东,把批处理“自动化”的特点表示的淋漓尽致。先先容一下这个脚本的来历:大家都知道汇编程序(MASM)的上机过程,先要对源代码进行汇编、连接,然后再实行,而这中间有很多环节须要输入很多东西,麻烦的很(只有经历过的朋友才懂得)。如何使这个过程变的大略呢?在我们搞汇编课程设计时,我“被逼”写了这个脚本,用起来很爽,呵呵。看看脚本内容:@echo off ::close echocls::clean screen echo This programme is to make the MASM programme automate ::display infoecho Edit by CODERED ::display infoecho Mailto me : qqkiller@sina.com ::display infoif "%1"=="" goto usage ::if input without paramater goto usageif "%1"=="/?" goto usage ::if paramater is "/?" goto usageif "%1"=="help" goto usage ::if paramater is "help" goto usage pause ::pause to see usagemasm %1.asm ::assemble the .asm codeif errorlevel 1 pause & edit %1.asm ::if error pause to see error msg and edit the codelink %1.obj & %1 ::else link the .obj file and execute the .exe file:usage ::set usageecho Usage: This BAT file name [asm file name] echo Default BAT file name is START.BAT ::display usage先不要被这一堆的东西给吓怕了,静下心来仔细的看(回忆一下第一章中第一段是怎么写的!
!
)。已经给出了每一行命令的阐明,两个冒号后面的内容为前一行内容阐明的E文(害怕E文的朋友也不用担心,都很easy,一看就懂了,实在不懂了不会查词典啊,这么
BAT批处理教程[二]
bat是dos下的批处理文件.cmd是nt内核命令行环境的另一种批处理文件从更广义的角度来看,unix的shell脚本以及其它操作系统乃至运用程序中由外壳进行阐明实行的文本,都具有与批处理文件十分相似的浸染,而且同样是由专用阐明器以行为单位阐明实行,这种文本形式更通用的称谓是脚本措辞。以是从某个程度剖析,batch, unix shell, awk, basic, perl等脚本措辞都是一样的,只不过运用的范围和解释的平台各有不同而已。乃至有些运用程序仍旧沿用批处理这一称呼,而其内容和扩展名与dos的批处理却又完备不同。=================================== 首先批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下实行的命令行一样),你可以利用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修正批处理文件。====注 =================== 批处理文件中完备可以利用非dos命令,乃至可以利用不具有可实行特性的普通数据性文件,这缘于windows系统这个新型阐明平台的涉入,使得批处理的运用越来越"边缘化"。以是我们谈论的批处理该当限定在dos环境或者命令行环境中,否则很多不雅观念和设定都须要做比较大的变动。======================== 其次,批处理文件是一种大略的程序,可以通过条件语句(if)和流程掌握语句(goto)来掌握命令运行的流程,在批处理中也可以利用循环语句(for)来循环实行一条命令。当然,批处理文件的编程能力与C措辞等编程语句比起来是十分有限的,也是十分不规范的。批处理的程序语句便是一条条的DOS命令(包括内部命令和外部命令),而批处理的能力紧张取决于你所利用的命令。====注 ================== 批处理文件(batch file)也可以称之为批处理程序(batch program),这一点与编译型措辞有所不同,就c措辞来说,扩展名为c或者cpp的文件可以称之为c措辞文件或者c措辞源代码,但只有编译连接后的exe文件才可以称之为c措辞程序。由于批处理文件本身既具有文本的可读性,又具有程序的可实行性,这些称谓的界线是比较模糊的。=========================== 第三,每个编写好的批处理文件都相称于一个DOS的外部命令,你可以把它所在的目录放到你的DOS搜索路径(path)中来使得它可以在任意位置运行。一个良好的习气是在硬盘上建立一个bat或者batch目录(例如C:\BATCH),然后将所有你编写的批处理文件放到该目录中,这样只要在path中设置上c:\batch,你就可以在任意位置运行所有你编写的批处理程序。====注 ===== 纯以dos系统而言,可实行程序大约可以细分为五类,依照实行优先级由高到低排列分别是:DOSKEY宏命令(预先驻留内存),COMMAND.COM中的内部命令(根据内存的环境随时进驻内存),以com为扩展名的可实行程序(由command.com直接载入内存),以exe位扩展名的可实行程序(由command.com重定位后载入内存),以bat位扩展名的批处理程序(由command.com阐明剖析,根据其内容按优先级顺序调用第2,3,4,5种可实行程序,剖析一行,实行一行,文件本身不载入内存)============ 第四,在DOS和Win9x/Me系统下,C:盘根目录下的AUTOEXEC.BAT批处理文件是自动运行批处理文件,每次系统启动时会自动运行该文件,你可以将系统每次启动时都要运行的命令放入该文件中,例如设置搜索路径,调入鼠标驱动和磁盘缓存,设置系统环境变量等。下面是一个运行于Windows 98下的autoexec.bat的示例:@ECHO OFF PATH C:\WINDOWS;C:\WINDOWS\COMMAND;C:\UCDOS;C:\DOSTools; C:\SYSTOOLS;C:\WINTOOLS;C:\BATCH LH SMARTDRV.EXE /X LH DOSKEY.COM /insert LH CTMOUSE.EXE SET TEMP=D:\TEMP SET TMP=D:\TEMP ====注 ===== AUTOEXEC.BAT为DOS系统的自动运行批处理文件,由COMMAND.COM启动时阐明实行;而在Win9x环境中,不仅增加支持了 DOSSTART.BAT, WINSTART.BAT等许多其它自动运行的批处理文件,对AUTOEXEC.BAT也增加了 .DOS .W40 .BAK .OLD .PWS等许多变体以适应繁芜的环境和多变的需求。==== willsort编注 ============= 以下关于命令的分类,有很多值得考虑的地方。常用命令中的@本不是命令,而dir、copy等也很常用的命令却没有列入,而分外命令中所有命令对我来说都是常用命令。建议将批处理所引用的命令分为内部命令、外部命令、第三办法式三类。而内部命令和外部命令中别有一类是专用于或常用于批处理中的命令可称之为"批处理命令"。以下摘录MS-DOS 6.22帮助文档中关于"批处理命令"的笔墨,当然,个中有些观点和定义已经有些掉队了。批处理命令批处理文件或批处理程序是一个包含多少MS-DOS命令的正文文件,扩展名为.BAT。当在命令提示符下敲入批处理程序的名称时,MS-DOS成组实行此批处理程序中的命令。任何在命令提示符下可利用的命令都可用在批处理程序中。此外,下面MS-DOS命令是专门在批处理程序中利用的。========== 常用命令echo、@、call、pause、rem(小技巧:用::代替rem)是批处理文件最常用的几个命令,我们就从他们开始学起。====注 =========== 首先, @不是一个命令,而是DOS批处理的一个分外标记符,仅用于屏蔽命令行回显.下面是DOS命令行或批处理中可能会见到的一些分外标记符: CR(0D)命令行结束符Escape(1B) ANSI转义字符勾引符Space(20)常用的参数界定符Tab(09) ; =不常用的参数界定符+ COPY命令文件连接符 ?文件通配符""字符串界定符|命令管道符< > >>文件重定向符@命令行回显屏蔽符/参数开关勾引符:批处理标签勾引符%批处理变量勾引符其次, ::确实可以起到rem的注释浸染,而且更简洁有效;但有两点须要把稳: 第一,除了 ::之外,任何以:开头的字符行,在批处理中都被视作标号,而直接忽略其后的所有内容,只是为了与正常的标号相差异,建议利用 goto所无法识别的标号,即在:后紧跟一个非字母数字的一个分外符号. 第二,与rem不同的是, ::后的字符行在实行时不会回显,无论是否用echo on打开命令行回显状态,由于命令阐明器不认为他是一个有效的命令行,就此点来看, rem在某些场合下将比 ::更为适用;其余, rem可以用于 config.sys文件中. ===================== echo表示显示此命令后的字符echo off表示在此语句后所有运行的命令都不显示命令行本身@与echo off相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。call调用另一个批处理文件(如果不用call而直接调用别的批处理文件,那么实行完那个批处理文件后将无法返回当前文件并实行当前文件的后续命令)。pause运行此句会停息批处理的实行并在屏幕上显示Press any key to continue...的提示,等待用户按任意键后连续rem表示此命令后的字符为阐明行(注释),不实行,只是给自己今后参考用的(相称于程序中的注释)。====注 ===== 此处的描述较为混乱,不如直接引用个命令的命令行帮助更为条理------------------------- ECHO 当程序运行时,显示或隐蔽批处理程序中的正文。也可用于许可或禁止命令的回显。在运行批处理程序时,MS-DOS一样平常在屏幕上显示(回显)批处理程序中的命令。利用ECHO命令可关闭此功能。语法ECHO [ON|OFF] 若要用echo命令显示一条命令,可用下述语法:echo [message] 参数ON|OFF 指定是否许可命令的回显。若要显示当前的ECHO的设置,可利用不带参数的ECHO 命令。message 指定让MS-DOS在屏幕上显示的正文。------------------- CALL 从一个批处理程序中调用另一个批处理程序,而不会引起第一个批处理的中止。语法CALL [drive:][path]filename [batch-parameters] 参数[drive:][path]filename 指定要调用的批处理程序的名字及其存放处。文件名必须用.BAT作扩展名。batch-parameters 指定批处理程序所需的命令行信息。------------------------------- PAUSE 停息批处理程序的实行并显示一条,提示用户按任意键连续实行。只能在批处理程序中利用该命令。语法PAUSE REM 在批处理文件或CONFIG.SYS中加入表明。也可用REM命令来屏蔽命令(在CONFIG.SYS 中也可以用分号 ;代替REM命令,但在批处理文件中则不能替代)。语法REM [string] 参数string 指定要屏蔽的命令或要包含的表明。======================= 例1:用edit编辑a.bat文件,输入下列内容后存盘为c:\a.bat,实行该批处理文件后可实现:将根目录中所有文件写入 a.txt中,启动UCDOS,进入WPS等功能。批处理文件的内容为:命令注释:@echo off不显示后续命令行及当前命令行dir c:\. >a.txt将c盘文件列表写入a.txt call c:\ucdos\ucdos.bat调用ucdos echo你好显示"你好" pause停息,等待按键连续rem准备运行wps注释:准备运行wps cd ucdos进入ucdos目录wps运行wps 批处理文件的参数批处理文件还可以像C措辞的函数一样利用参数(相称于DOS命令的命令行参数),这须要用到一个参数表示符"%"。%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示。例2:C:根目录下有一批处理文件名为f.bat,内容为:@echo off format %1 如果实行C:\>f a: 那么在实行f.bat时,%1就表示a:,这样format %1就相称于format a:,于是上面的命令运行时实际实行的是format a: 例3:C:根目录下一批处理文件名为t.bat,内容为: @echo off type %1 type %2 那么运行C:\>t a.txt b.txt %1 :表示a.txt %2 :表示b.txt 于是上面的命令将顺序地显示a.txt和b.txt文件的内容。====注 =============== 参数在批处理中也作为变量处理,以是同样利用百分号作为勾引符,其后跟0-9中的一个数字构成参数引用符.引用符和参数之间(例如上文中的 %1与 a: )的关系类似于变量指针与变量值的关系.当我们要引用第十一个或更多个参数时,就必须移动DOS的参数起始指针. shift命令正充当了这个移动指针的角色,它将参数的起始指针移动到下一个参数,类似C措辞中的指针操作.图示如下: 初始状态, cmd为命令名,可以用 %0引用cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | | | %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 经由1次shift后, cmd将无法被引用cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | | | %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 经由2次shift后, arg1也被废弃, %9指向为空,没有引用意义cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 ^ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | | %0 %1 %2 %3 %4 %5 %6 %7 %8 遗憾的是, win9x和DOS下均不支持 shift的逆操作.只有在 nt内核命令行环境下, shift才支持 /n参数,可以以第一参数为基准返复移动起始指针. ================= 分外命令if goto choice for是批处理文件中比较高等的命令,如果这几个你用得很闇练,你便是批处理文件的专家啦。一、if是条件语句,用来判断是否符合规定的条件,从而决定实行不同的命令。有三种格式: 1、if [not] "参数" == "字符串"待实行的命令参数如果即是(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。例:if "%1"=="a" format a: ==== if的命令行帮助中关于此点的描述为: IF [NOT] string1==string2 command 在此有以下几点须要把稳: 1.包含字符串的双引号不是语法所必须的,而只是习气上利用的一种"防空"字符2. string1未必是参数,它也可以是环境变量,循环变量以及其他字符串常量或变量3. command不是语法所必须的, string2后跟一个空格就可以构成一个有效的命令行============================= 2、if [not] exist [路径\]文件名待实行的命令如果有指定的文件,则条件成立,运行命令,否则运行下一句。如: if exist c:\config.sys type c:\config.sys 表示如果存在c:\config.sys文件,则显示它的内容。注 也可以利用以下的用法: if exist command device是指DOS系统中已加载的设备,在win98下常日有: AUX, PRN, CON, NUL COM1, COM2, COM3, COM4 LPT1, LPT2, LPT3, LPT4 XMSXXXX0, EMMXXXX0 A: B: C: ..., CLOCK$, CONFIG$, DblBuff$, IFS$HLP$ 详细的内容会因硬软件环境的不同而略有差异,利用这些设备名称时,须要担保以下三点: 1.该设备确实存在(由软件虚拟的设备除外) 2.该设备驱动程序已加载(aux, prn等标准设备由系统缺省定义) 3.该设备已准备好(紧张是指a: b: ..., com1..., lpt1...等) 可通过命令 mem/d | find "device" /i来校阅阅兵你的系统中所加载的设备其余,在DOS系统中,设备也被认为是一种分外的文件,而文件也可以称作字符设备;由于设备(device)与文件都是利用句柄(handle)来管理的,句柄便是名字,类似于文件名,只不过句柄不是运用于磁盘管理,而是运用于内存管理而已,所谓设备加载也即指在内存中为其分配可引用的句柄. ================================== 3、if errorlevel <数字>待实行的命令很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),通过if errorlevel命令可以判断程序的返回值,根据不同的返回值来决定实行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值即是指定的数字,则条件成立,运行命令,否则运行下一句。如if errorlevel 2 goto x2 ====注 =========== 返回值从大到小的顺序排列不是必须的,而只是实行命令为 goto时的习惯用法,当利用 set作为实行命令时,常日会从小到大顺序排列,比如需将返回码置入环境变量,就需利用以下的顺序形式: if errorlevel 1 set el=1 if errorlevel 2 set el=2 if errorlevel 3 set el=3 if errorlevel 4 set el=4 if errorlevel 5 set el=5 ... 当然,也可以利用以下循环来替代,事理是同等的: for %%e in (1 2 3 4 5 6 7 8...) do if errorlevel %%e set el=%%e 更高效简洁的用法,可以参考我写的另一篇关于获取 errorlevel的文章涌现此种征象的缘故原由是, if errorlevel比较返回码的判断条件并非即是,而是大于即是.由于 goto的跳转特性,由小到大排序会导致在较小的返回码处就跳出;而由于 set命令的"重复"赋值特性,由大到小排序会导致较小的返回码"覆盖"较大的返回码. 其余,虽然 if errorlevel=<数字> command也是有效的命令行,但也只是 command.com阐明命令行时将 =作为命令行切分符而忽略掉罢了=========================== 二、goto批处理文件运行到这里将跳到goto所指定的标号(标号即label,标号用:后跟标准字符串来定义)处,goto语句一样平常与if合营利用,根据不同的条件来实行不同的命令组。如: goto end :end echo this is the end 标号用":字符串"来定义,标号所在行不被实行。==== willsort编注label常被译为"标签" ,但是这并不具有广泛的约定性. goto与 :联用可实现实行中途的跳转,再结合 if可实现实行过程的条件分支,多个 if即可实现命令的分组,类似 C中 switch case构造或者 Basic中的 select case构造,大规模且构造化的命令分组即可实现高等措辞中的函数功能.以下是批处理和C/Basic在语法构造上的对照: Batch C / Basic goto&: goto&: goto&:&if if{}&else{} / if&elseif&endif goto&:&if... switch&case / select case goto&:&if&set&envar... function() / function(),sub() ================================== 三、choice利用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的errorlevel,然后于if errorlevel合营,根据用户的选择运行不同的命令。把稳:choice命令为DOS或者Windows系统供应的外部命令,不同版本的choice命令语法会稍有不同,请用choice /?查看用法。choice的命令语法(该语法为Windows 2003中choice命令的语法,其它版本的choice的命令语法与此大同小异):CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text] 描述: 该工具许可用户从选择列表选择一个项目并返回所选项目的索引。参数列表: /C choices指定要创建的选项列表。默认列表是 "YN"。/N在提示符中隐蔽选项列表。提示前面的得到显示,选项依旧处于启用状态。/CS许可选择分大小写的选项。在默认情形下,这个工具是不分大小写的。/T timeout做出默认选择之前,停息的秒数。可接管的值是从 0 到 9999。如果指定了0,就不会有停息,默认选项会得到选择。/D choice在 nnnn秒之后指定默认选项。字符必须在用 /C选项指定的一组选择中;同时,必须用 /T指定 nnnn。/M text指定提示之前要显示的。如果没有指定,工具只显示提示。/?显示帮助。把稳: ERRORLEVEL环境变量被设置为从选择集选择的键索引。列出的第一个选择返回1,第二个选择返回2,等等。如果用户按的键不是有效的选择,该工具会发出警告响声。如果该工具检测到缺点状态,它会返回 255的ERRORLEVEL值。如果用户按 Ctrl+Break或 Ctrl+C键,该工具会返回 0 的 ERRORLEVEL值。在一个批程序中利用 ERRORLEVEL参数时,将参数降序排列。示例: CHOICE /? CHOICE /C YNC /M "确认请按Y,否请按N,或者取消请按C。" CHOICE /T 10 /C ync /CS /D y CHOICE /C ab /M "选项 1请选择a,选项 2请选择b。" CHOICE /C ab /N /M "选项 1请选择a,选项 2请选择b。" ==== willsort编注 =============================== 我列出win98下choice的用法帮助,已资区分Waits for the user to choose one of a set of choices. 等待用户选择一组待选字符中的一个CHOICE [/C[:]choices] [/N] [/S] [/T[:]c,nn] [text] /C[:]choices Specifies allowable keys. Default is YN 指定许可的按键(待选字符),默认为YN /N Do not display choices and ? at end of prompt string. 不显示提示字符串中的问号和待选字符/S Treat choice keys as case sensitive. 处理待选字符时大小写敏感/T[:]c,nn Default choice to c after nn seconds 在 nn秒后默认选择 c text Prompt string to display 要显示的提示字符串ERRORLEVEL is set to offset of key user presses in choices. ERRORLEVEL被设置为用户键入的字符在待选字符中的偏移值如果我运行命令:CHOICE /C YNC /M "确认请按Y,否请按N,或者取消请按C。" 屏幕上会显示:确认请按Y,否请按N,或者取消请按C。 [Y,N,C]? 例:test.bat的内容如下(把稳,用if errorlevel判断返回值时,要按返回值从高到低排列): @echo off choice /C dme /M "defrag,mem,end" if errorlevel 3 goto end if errorlevel 2 goto mem if errorlevel 1 goto defrag :defrag c:\dos\defrag goto end :mem mem goto end :end echo good bye 此批处理运行后,将显示"defrag,mem,end[D,M,E]?",用户可选择d m e,然后if语句根据用户的选择作出判断,d表示实行标号为defrag的程序段,m表示实行标号为mem的程序段,e表示实行标号为end的程序段,每个程序段末了都以goto end将程序跳到end标号处,然后程序将显示good bye,批处理运行结束。四、for循环命令,只要条件符合,它将多次实行同一命令。语法:对一组文件中的每一个文件实行某个特定命令。FOR %%variable IN (set) DO command [command-parameters] %%variable指定一个单一字母可更换的参数。(set)指定一个或一组文件。可以利用通配符。command指定对每个文件实行的命令。command-parameters 为特定命令指定参数或命令行开关。例如一个批处理文件中有一行: for %%c in (.bat .txt) do type %%c 则该命令行会显示当前目录下所有以bat和txt为扩展名的文件的内容。==== willsort编注 ===================================================== 须要指出的是,当()中的字符串并非单个或多个文件名时,它将纯挚被当作字符串更换,这个特性再加上()中可以嵌入多个字符串的特性,很明显 for可以被看作一种遍历型循环. 当然,在 nt/2000/xp/2003系列的命令行环境中, for被授予了更多的特性,使之可以剖析命令输出或者文件中的字符串,也有很多开关被用于扩展了文件更换功能. ======================================================================== 批处理示例1. IF-EXIST 1)首先用记事本在C:\建立一个test1.bat批处理文件,文件内容如下:@echo off IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist 然后运行它:C:\>TEST1.BAT 如果C:\存在AUTOEXEC.BAT文件,那么它的内容就会被显示出来,如果不存在,批处理就会提示你该文件不存在。2)接着再建立一个test2.bat文件,内容如下:@ECHO OFF IF EXIST \%1 TYPE \%1 IF NOT EXIST \%1 ECHO \%1 does not exist 实行: C:\>TEST2 AUTOEXEC.BAT 该命令运行结果同上。解释:(1) IF EXIST是用来测试文件是否存在的,格式为IF EXIST [路径+文件名]命令(2) test2.bat文件中的%1是参数,DOS许可通报9个批参数信息给批处理文件,分别为%1~%9(%0表示test2命令本身),这有点象编程中的实参和形参的关系,%1是形参,AUTOEXEC.BAT是实参。==== willsort编注 ===================================================== DOS没有"许可通报9个批参数信息"的限定,参数的个数只会受到命令行长度和所调用命令处理能力的限定.但是,我们在批处理程序中,在同一时候只能同时引用10个参数,由于 DOS只给出了 %0~%9这十个参数引用符. ======================================================================== 3)更进一步的,建立一个名为TEST3.BAT的文件,内容如下:@echo off IF "%1" == "A" ECHO XIAO IF "%2" == "B" ECHO TIAN IF "%3" == "C" ECHO XIN 如果运行:C:\>TEST3 A B C 屏幕上会显示: XIAO TIAN XIN 如果运行:C:\>TEST3 A B 屏幕上会显示XIAO TIAN 在这个命令实行过程中,DOS会将一个空字符串指定给参数%3。2、IF-ERRORLEVEL 建立TEST4.BAT,内容如下:@ECHO OFF XCOPY C:\AUTOEXEC.BAT D:\ IF ERRORLEVEL 1 ECHO文件拷贝失落败IF ERRORLEVEL 0 ECHO成功拷贝文件然后实行文件: C:\>TEST4 如果文件拷贝成功,屏幕就会显示"成功拷贝文件",否则就会显示"文件拷贝失落败"。IF ERRORLEVEL是用来测试它的上一个DOS命令的返回值的,把稳只是上一个命令的返回值,而且返回值必须依照从大到小次序顺序判断。因此下面的批处理文件是缺点的:@ECHO OFF XCOPY C:\AUTOEXEC.BAT D:\ IF ERRORLEVEL 0 ECHO成功拷贝文件IF ERRORLEVEL 1 ECHO未找到拷贝文件IF ERRORLEVEL 2 ECHO用户通过ctrl-c中止拷贝操作IF ERRORLEVEL 3 ECHO预置缺点阻挡文件拷贝操作IF ERRORLEVEL 4 ECHO拷贝过程中写盘缺点无论拷贝是否成功,后面的:未找到拷贝文件用户通过ctrl-c中止拷贝操作预置缺点阻挡文件拷贝操作拷贝过程中写盘缺点都将显示出来。以下便是几个常用命令的返回值及其代表的意义:backup 0备份成功1未找到备份文件2文件共享冲突阻挡备份完成3用户用ctrl-c中止备份4由于致命的缺点使备份操作中止diskcomp 0盘比较相同1盘比较不同2用户通过ctrl-c中止比较操作3由于致命的缺点使比较操作中止4预置缺点中止比较diskcopy 0盘拷贝操作成功1非致命盘读/写错2用户通过ctrl-c结束拷贝操作3因致命的处理缺点使盘拷贝中止4预置缺点阻挡拷贝操作format 0格式化成功3用户
