对于许多计算机编程初学者都有这样的体会:
好不容易学了个C语言,发现要开发点实用一点的程序还要去看大部头的MSDN什么的...想起来就头痛,而且只学习C语言,除了编几个hello world或者什么排序算法,基本上没什么实用价值...
今天在公司花了一个整下午时间(老板脸色要不好看了),把windows批处理文件好好研究了一下,随手记下了批处理的心得,发现批处理其实可以当作一门简单的语言来学习,而且通过几小时的学习可以马上就能编出非常实用的程序,可以大大鼓舞兄弟们的学习积极性,可谓居家旅行,黑人电脑之必备良药。
关于批处理的命令的详细解释,请大家参看下面的帮助文档,我也是从中学习得到的。而且将本贴和下面的文档结合起来看,再顺手编几个小程序,可以达到事半功倍的效果。
<windows 2000 命令参考>
批处理命令中最复杂的就是For命令了,这里重点对它讲一下(其它的命令大家可以看windows帮助,因为个人觉帮助文档中对for命令的解释含糊不清,都是我通过实验才猜出来怎么用的)
开始了:
前面的话:批处理中的命令也可以直接在ms-dos的界面下输入,不过要注意:如下面例1中的一样,在MS-DOS下面输入时,变量是一个'%',如果写成.bat文件,则要用两个'%',即'%%'
另:.bat文件可以用文本编辑器直接打开进行编写。
For命令(相关语法含义请参考windows帮助文档):
Example 1:
for %f in (*.txt) do type %f //命令行中使用
for %%f in (*.txt) do type %%f//批处理中使用
上面这个例子的意思是:在当前目录下,对目录下的每个.txt文件都执行 type *.txt命令
%f为替换符,从代替每个从(*.txt)中取出的每个命令的元素,进行执行。
如当前目录下有a.txt,b.txt两个txt文件,则上面那条命令相当于:
type a.txt
type b.txt
Example 2:
for /L %f in (2,1,255) do ping 192.168.254.%f -n 1 //命令行
for /L %%f in (2,1,255) do ping 192.168.254.%%f -n 1//批处理文件
//注意","不要写错成全角或者其它的符号
意思是,以开始为2,每次循环加1,一直增加到255。%f表示增加得到的数字,每增加一次,执行一次ping 192.168.254.%f -n 1
上面这条语句等于依次执行下面的语句序列:
ping 192.168.254.2 -n 1
ping 192.168.254.3 -n 1
...
ping 192.168.254.254 -n 1
Example 3:
For + 筛选器命令 + 管道:
for /L %%f in (1,1,256) do ping 192.168.254.%%f -n 1 | find "Reply"
|表示管道,可以在帮助文档中找到,意思是前面命令在MS-DOS下面的输出当成后面一个命令的输入。比如说:
执行命令:ping 192.168.242.39 -n 1 | find "Reply"
C:/Documents and Settings/朱文/桌面>ping 192.168.242.39 -n 1
Pinging 192.168.242.39 with 32 bytes of data:
Reply from 192.168.242.39: bytes=32 time<10ms TTL=128
Ping statistics for 192.168.242.39:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
上面红色的部分就是| find "Reply"的输入
上面的例子的意思是说循环ping 子网(192.168.254.*)中的地址,过滤出有回应的地址。这个例子我会做成.bat文件粘在附件上。大家可以用这个.bat文件查看子网中有哪些机器(当然,要能回应ping才行)
Example 4:
for /F "usebackq delims==" %i IN (`set`) DO @echo %i//命令行
for /F "usebackq delims==" %%i IN (`set`) DO @echo %%i//批处理
意思是:将set命令的输出当成文件,对每行输出进行解析,输出每行字符中'='前面的部分
这个和前面的管道|有些相似。
Example 5:
for /F "usebackq eol=A" %%i IN (`set`) DO @echo %%i//批处理
忽略以A开头的行,usebackq 表示`set`是一条cmd的命令,而'set'为字符串
注意,与上面的不同,'set'为字符串,`set`为命令
Example 6:
for /F "usebackq tokens=2,3* " %%i in (`set`) do echo %%i * %%j * %%k ** !
令牌的意思是第几个字符串,上面的意思是说,%i,%j,%k分别代表第2个,第3个,和最后所有的字符串,字符串是由空格等区分的
个人觉得帮助文档在这里的翻译很烂,token翻译成令牌让我感觉和网络里面的令牌环有点混淆,而且也不知道是什么意思,还是我通过实验才猜出来的。这里的token应该理解成被空格隔开的字符串,如
I am Zhuwen,I就是第一个token,am是第二个token,zhuwen是第三个token
Example 6:
Echo命令:
echo off //关闭命令的回显,但本条命令会显示 @echo off关闭回显,且本条命令不显示
echo.
echo This batch program
echo formats and checks
echo new disks
echo.
大家可以再看看文档,里面还有if等一些有用的关键字,但都比较简单,一看就能看懂,所以这里也不多说了。
可能大家会问:批处理程序有什么用?
随便举几个例子吧:
1.最容易想到,也是激发我学习批处理的原因:想找出公司子网里面有哪些机器。用C太复杂了,人又懒,不想下代理猎手什么的,于是就想到了批处理,呵呵。
2.用批处理可以做一个类似windows搜索的东东,找出想要的文件或者文件中的字符串---多有成就啊:)
3.对那种在MS-DOS下面有大量输出的软件,可以用批处理来筛选有用的信息
例一、先给出一个最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的文件,它里面记录的信息可以帮助你迅速找到速度最快的qq服务器,从而远离“从服务器中转”那一痛苦的过程。这里>的意思,是把前面命令得到的东西放到后面所给的地方,>>的作用,和>的相同,区别是把结果追加到前一行得出的结果的后面,具体的说是下一行,而前面一行命令得出的结果将保留,这样可以使这个a.txt文件越来越大(想到如何搞破坏了??)。By the way,这个批处理还可以和其他命令结合,搞成完全自动化判断服务器速度的东东,执行后直接显示速度最快的服务器IP,是不是很爽?后面还将详细介绍。 中国网管论坛bbs.bitsCN.com
例二、再给出一个已经过时的例子(a.bat):
@echo off
if exist C:/Progra~1/Tencent/AD/*.gif del C:/Progra~1/Tencent/AD/*.gif
a.bat
为什么说这是个过时的例子呢?很简单,因为现在已经几乎没有人用带广告的QQ了(KAO,我的QQ还显示好友三围呢!!),所以它几乎用不上了。但曾经它的作用是不可小窥的:删除QQ的广告,让对话框干干净净。这里用的地址是qq的默认安装地址,默认批处理文件名为a.bat,你当然可以根据情况自行修改。在这个脚本中使用了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这个东东;二、可根据自己的实际情况进行改动,使其符合自己的要求。
例五,先看一个实例。这是一个很有意思的脚本,一个小巧实用的好东东,把批处理“自动化”的特点体现的淋漓尽致。先介绍一下这个脚本的来历:大家都知道汇编程序(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
网管网www_bitscn_com
::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
先不要被这一堆的东西给吓怕了,静下心来仔细的看(回想一下第一章中第一段是怎么写的!!)。已经给出了每一行命令的解释,两个冒号后面的内容为前一行内容解释的E文(害怕E文的朋友也不用担心,都很easy,一看就懂了,实在不懂了不会查词典啊,这么懒?),在脚本执行时不显示,也不起任何作用。倒数第5行行首有一个冒号,可不是笔误哦!具体作用后面会详细讲到。此脚本中masm和link是汇编程序和连接程序,必须和edit程序以及你要编辑的源代码(当然还有这个脚本,废话!)一起在当前目录中。使用这个批处理脚本,可以最大可能的减少手工输入,整个过程中只需要按几下回车键,即可实现从汇编源代码到可执行exe文件的自动化转换,并具备智能判断功能:如果汇编时源代码出现错误(汇编不成功),则自动暂停显示错误信息,并在按任意键后自动进入编辑源代码界面;如果源代码汇编成功,则进行连接,并在连接后自动执行生成的exe文件。另外,由于批处理命令的简单性和灵活性,这个脚本还具备良好的可改进性,简单进行修改就可以符合不同朋友的上机习惯。正在学汇编的朋友,一定别忘了实习一下!
在这个脚本中出现了如下几个命令:@、echo、::、pause、:和goto、%以及if。而这一章就将讲述这几个命令。
1、@
这个符号大家都不陌生,email的必备符号,它怎么会跑到批处理中呢?呵呵,不是它的错,批处理本来就离不开它,要不就不完美了。它的作用是让执行窗口中不显示它后面这一行的命令本身(多么绕口的一句话!)。呵呵,通俗一点说,行首有了它的话,这一行的命令就不显示了。在例五中,首行的@echo off中,@的作用就是让脚本在执行时不显示后面的echo off部分。这下懂了吧?还是不太懂?没关系,看完echo命令简介,自然就懂了。
2、echo
中文为“反馈”、“回显”的意思。它其实是一个开关命令,就是说它只有两种状态:打开和关闭。于是就有了echo on和echo off两个命令了。直接执行echo命令将显示当前echo命令状态(off或on)执行echo off将关闭回显,它后面的所有命令都不显示命令本身,只显示执行后的结果,除非执行echo on命令。在例五中,首行的@命令和echo off命令联合起来,达到了两个目的:不显示echo off命令本身,不显示以后各行中的命令本身。的确是有点乱,但你要是练习一下的话,3分钟包会,不会的退钱!
echo命令的另一种用法一:可以用它来显示信息!如例五中倒数第二行,Default BAT file name is START.BAT将在脚本执行后的窗口中显示,而echo命令本身不显示(为什么??)。
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的文件,直接执行就会得到结果。
文章转载自网管之家:http://www.bitscn.com/network/hack/201002/180422_3.html