批处理的本质,是一堆DOS命令按一定顺序排列而形成的集合。批处理,也称为批处理脚本,英文译为BATCH,批处理文件后缀BAT就取的前三个字母。它的构成没有固定格式,只要遵守以下这条就ok了:每一行可视为一 个命令,每个命令里可以含多条子命令,从第一行开始执行,直到最后一行结束,它运行的平台是DOS。批处理有一个很鲜明的特点:使用方便、灵活,功能强 大,自动化程度高。
下面通过实战来认识一下batch朋友。以下例子的代码保存成以cmd或者bat为扩展名的文件。批处理在执行过程中你可以用CTRL+C强行终止命令或者直接关闭命令行窗口。
1,命令的结果保存起来
要点:command > filename.txt 将命令的结果保存到filename.txt文件中(注意如果filename.txt文件已经存在,会覆盖它,而不是追加);
而追加入filename.txt我们可以用>>,如command >> filename.txt。
例子:
ping sz1.tencent.com >> a.txt
pause
2, 删除部分文件
if exist D:\PSP资源列表\batch学习\入门\AD\*.gif del D:\PSP资源列表\batch学习\
入门\AD\*.gif
pause
3,在命令行窗口中打印字符
echo "Hello,world!"
pause
4,在文件中查找
ping sz.tencent.com > a.txt
type a.txt | find "Pinging" && echo "had found!"
pause
其中,组合命令&&和管道命令|
5、@
它的作用是让执行窗口中,不显示它后面这一行的命令本身。通俗一点说,行首有了它的话,这一行的命令就不显示了。
如@echo on
6、echo
中 文为“反馈”、“回显”的意思。它其实是一个开关命令,就是说它只有两种状态:打开和关闭。于是就有了echo on和echo off两个命令了。直接执行echo命令将显示当前echo命令状态(off或on)执行echo off将关闭回显,它后面的所有命令都不显示命令本身,只显示执行后的结果,除非执行echo on命令。
如@cheo off是@命令和echo off命令联合起来,达到了两个目的:不显示echo off命令本身,不显示以后各行中的命令本身。
echo命令的另一种用法一:可以用它来显示信息!
echo命令的另一种用法二:可以直接编辑文本文件。例六:
echo nbtstat -A 192.168.0.1 > a.bat
以上脚本内容的编辑方法是,直接是命令行输入,每行一回车。最后就会在当前目录下生成一个a.bat的文件,直接执行就会得到结果。
7、::
它后面的内容在执行时不显示,也不起任何作用,因为它只是注释,只是增加了脚本的可读性。
如
echo OK
::this is displaying information ok
8、pause
中文为“暂停”的意思
9、:和goto
goto是个跳转命令,:是一个标签。当程序运行到goto时,将自动跳转到:定义的部分去执行了。
goto命令的另一种用法一:提前结束程序。在程序中间使用goto命令跳转到某一标签,而这一标签的内容却定义为退出。如:
……
goto end
……
:end
10、%
它只是批处理中的参数而已
例如,bat文件test.bat内容如下:echo %1
执行时test.bat parameter
11、if
if命令是一个表示判断的命令,根据得出的每一个结果,它都可以对应一个相应的操作。关于它的三种用法,在这里分开讲。
(1)、输入判断
if "%1"=="" goto usage
if "%1"=="/?" goto usage
if "%1"=="help" goto usage
(2)、存在判断。再看例二里这句:
if exist C:"Progra~1"Tencent"AD"*.gif del C:"Progra~1"Tencent"AD"*.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
IF [NOT] ERRORLEVEL number do command
IF [NOT] string1==string2 do command
IF [NOT] EXIST filename do command
12、call
在批处理脚本中,call命令用来从一个批处理脚本中调用另一个批处理脚本。
start.bat:
……
CALL 10.BAT 0
……
10.bat:
……
ECHO %IPA%.%1 >HFIND.TMP
……
CALL ipc.bat IPCFind.txt
13、find
这是一个搜索命令,用来在文件中搜索特定字符串
@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.txt中的内容,而是直 接使用find命令在a.txt中找“7626”(find a.txt "7626" && echo "Congratulations! You have infected GLACIER!"),就必须得给出这个a.txt的绝对路径。因为在find命令的帮助里有这么一句话:如果没有指定路径,find将搜索键入的或者由另一个命令产生的文字。这里的“另一个命令”自然就指的 type命令了。
下面从管道命令讲起。常用的管道命令有以下这些:|、>、>>
14、|
这
个命令恐怕大家不是很陌生,经常操作DOS的朋友都应该知道,当我们查看一个命令的帮助时,如果帮助信息比较长,一屏幕显示不完时DOS并不给我们时间让
我们看完一屏幕再翻到另一屏幕,而是直接显示到帮助信息的最后。如在提示符下输入help回车时,就会看到当前DOS版本所支持的所有非隐含命令,但你只
能看到最后的那些命令,前面的早就一闪而过了,如何解决这个问题?看例十三:
help | more
回车后会发现显示满一屏幕后就自动暂停,等候继续显示其他信息。当按写回车时,变成一个一个的出现;按下空格键时一屏幕一屏幕显示,直到全部显示完为止;按其他键自动停止返回DOS。
为什么会出现上述现象?答案很简单,这里结合了管道命令|和DOS命令more来共同达到目的的。这里先简单介绍一下help命令和more命令,对理解|命令的用法有很大帮助。
14.1、
help命令。其实这个命令是不需要多说的,但在上述例子中help命令的用法比较特殊,直接在DOS提示符下输入help命令,结果是让DOS显示其所
支持的所有非隐含命令,而在其他地方用help命令,如输入net help回车,则是显示net命令的帮助信息。
14.2、more命
令。可能很多朋友以前就没有接触过这个命令,这个命令在Linux下的用处非常广泛,也是管道命令之一。大家可以找一篇比较长的文章(a.txt)在
DOS提示符下输入如下两个命令去比较一下差别:more a.txt和type
a.txt。利用more命令,可以达到逐屏或逐行显示输出的效果,而type命令只能一次把输出显示完,最后的结果就是只能看到末尾的部分。在例十三
里,more命令的作用就是让输出的信息逐屏或逐行显示。
看到这里,你是否已经能隐约感受到了|命令的作用了?没错,它的作用,就是把前一命令的
输出当后一命令的输入来用的。在例十三里,前一命令的输出,就是help命令执行后显示的DOS所支持的所有非隐含命令,而这个结果刚好做了后一命令
more的输入。所以例十三和下面的例十四是等效的:
help > a.txt
more a.txt
del a.txt
这里利用另一管道命令>生成了一个a.txt文件作为中间环节,在用more命令查看a.txt文件后再删除a.txt文件(例十三的所有操作是在内存中进行的,不生成文件)。可以看出,正确使用管道命令|可以带来事半功倍的效果。
结合例十三和例十四,以及前面的例九再体会一遍:|命令的作用,就是让前一命令的输出当做后一命令的输入。
15、>、>>
这 两个命令的效果从本质上来说都是一样的,他们都是输出重定向命令,说的通俗一点,就是把前面命令的输出写入到一个文件中。这两个命令的唯一区别是,
>会清除掉原有文件中的内容后把新的内容写入原文件,而>>只会另起一行追加新的内容到原文件中,而不会改动其中的原有内容。例十五:
echo @echo off > a.bat
echo echo This is a pipeline command example. >> a.bat
echo echo It is very easy? >> a.bat
echo echo Believe your self! >> a.bat
echo pause >> a.bat
echo exit >> a.bat
依次在DOS提示符下输入以上各行命令,一行一个回车,将在当前目录下生成一个a.bat文件,里面的内容如下:
@echo off
echo This is a pipeline command example.
echo It is very easy?
echo Believe your self!
pause
exit
看
到这里,你得到了多少信息?1、可以直接在DOS提示符下利用echo命令的写入功能编辑一个文本,而不需要专门的文本编辑工具;2、管道命令>和
>>的区别如上所述。如果这里只用>命令来完成上面操作,最后也会生成一个a.bat,但里面的内容就只剩下最后一行exit了。所以
>和>>一般都联合起来用,除非你重定向的输出只有一行,那么就可以只用>了。结合例一再仔细体会输出重定向管道命令>和
>>的用法。
16、<、>&、<&
这三个命令也是管道命令,但它们一般不常用,你只需要知道一下就ok了,当然如果想仔细研究的话,可以自己查一下资料。
<,输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。
>&,将一个句柄的输出写入到另一个句柄的输入中。
<&,刚好和>&相反,从一个句柄读取输入并将其写入到另一个句柄输出中。
关于这三个管道命令的举例,在后面批处理脚本的精妙应用中还将涉及到。
下面介绍组合命令:&、&&、||
组合命令,顾名
思义,就是可以把多个命令组合起来当一个命令来执行。这在批处理脚本里是允许的,而且用的非常广泛。它的格式很简单----既然现在已经成了一个文件了,
那么这多个命令就要用这些组合命令连接起来放在同一行----因为批处理认行不认命令数目。组合命令的作用,就如同给爱人陪不是,说一句是说,说十句也是
说,不一次把好话都说了出来,效果可能会好些----当然得排除一种特殊情况:这些话是否有先后顺序,有些话是否可以同时说。在批处理脚本里也一样,有些
时候某些命令是不能同时执行的。
17、&
这可以说是最简单的一个组合命令了,它的作用是用来连接n个DOS命令,并把这些命令按顺序执行,而不管是否有命令执行失败。例十六:
copy a.txt b.txt /y & del a.txt
其实这句和move a.txt b.txt的效果是一样的,只不过前者是分了两步来进行的(在后面还将涉及到具体使用哪种方法的问题)。这个命令很简单,就不多费口舌了,唯一需要注意的一点是,这里&两边的命令是有执行顺序的,从前往后执行。
18、&&
切
记,这里介绍的几个命令都是组合命令,所以他们前后都必须都有其他命令(要不如何组合?)。这个命令也不例外,它可以把它前后两个命令组合起来当一个命令
来用,与&命令不同之处在于,它在从前往后依次执行被它连接的几个命令时会自动判断是否有某个命令执行出错,一旦发现出错后将不继续执行后面剩下
的命令。这就为我们自动化完成一些任务提供了方便。例十七:
dir 文件://1%/www/user.mdb && copy 文件://1%/www/user.mdb e:"backup"www
如果远程主机存在user.mdb,则copy到本地e:"backup"www,如果不存在当然就不执行copy了。这句对搞网管的朋友是否有点用呢?呵呵。其实它和下面这句的作用是一样的:
if exist 文件://1%/www/user.mdb copy 文件://1%/www/user.mdb e:"backup"www
至于你喜欢用哪个就随便了,我没办法判断dir和if两个命令哪一个执行效率更高,所以不知道用哪个更好,呵呵。
你
是否还记得“有些命令是不能同时执行的”?你是否相信这句话?当然得相信,不信就给你出道题:把C盘和D盘的文件和文件夹列出到a.txt文件中。你将如
何来搞定这道题?有朋友说,这还不是很easy的问题吗?同时执行两个dir,然后把得到的结果>到a.txt里就ok了嘛,看例十八:
dir c:" && dir d:" > a.txt
仔
细研究一下这句执行后的结果,看看是否能达到题目的要求!错了!这样执行后a.txt里只有D盘的信息!为什么?就因为这里&&命令和
>命令不能同时出现一个句子里(批处理把一行看成一个句子)!!组合命令&&的优先级没有管道命令>的优先级高(自己总结
的,不妥的地方请指正)!所以这句在执行时将本分成这两部分:dir c:"和dir d:" > a.txt,而并不是如你想的这两部分:dir
c:" && dir d:"和> a.txt。要使用组合命令&&达到题目的要求,必须得这么写:
dir c:" > a.txt && dir d:" >> a.txt
这样,依据优先级高低,DOS将把这句话分成以下两部分:dir c:" > a.txt和dir d:" >> a.txt。例十八中的几句的差别比较特殊,值得好好研究体会一下。
当然这里还可以利用&命令(自己想一下道理哦):
dir c:" > a.txt & dir d:" >> a.txt
19、||
这个命令的用法和&&几乎一样,但作用刚好和它相反:利用这种方法在执行多条命令时,当遇到一个执行正确的命令就退出此命令组合,不再继续执行下面的命令。题目:查看当前目录下是否有以s开头的exe文件,如果有则退出。例:
@echo off
dir s*.exe || exit
发表评论