找回密码
 注册
搜索
热搜: 超星 读书 找书
查看: 2779|回复: 2

[【原创】] 教你如何进行批处理文件编程

[复制链接]
zwzw1 该用户已被删除
发表于 2005-8-11 19:34:12 | 显示全部楼层 |阅读模式
对于许多计算机编程初学者都有这样的体会:
好不容易学了个C语言,发现要开发点实用一点的程序还要去看大部头的MSDN什么的...想起来就头痛,而且只学习C语言,除了编几个hello world或者什么排序算法,基本上没什么实用价值...

今天在公司花了一个整下午时间(老板脸色要不好看了),把windows批处理文件好好研究了一下,随手记下了批处理的心得,发现批处理其实可以当作一门简单的语言来学习,而且通过几小时的学习可以马上就能编出非常实用的程序,可以大大鼓舞兄弟们的学习积极性,可谓居家旅行,黑人电脑之必备良药。


关于批处理的命令的详细解释,请大家参看下面的帮助文档,我也是从中学习得到的。而且将本贴和下面的文档结合起来看,再顺手编几个小程序,可以达到事半功倍的效果。
<windows 2000 命令参考>

批处理命令中最复杂的就是For命令了,这里重点对它讲一下(其它的命令大家可以看windows帮助,因为个人觉帮助文档中对for命令的解释含糊不清,都是我通过实验才猜出来怎么用的)

开始了:
前面的话:批处理中的命令也可以直接在ms-dos的界面下输入,不过要注意:如下面例1中的一样,在MS-DOS下面输入时,变量是一个&#39;%&#39;,如果写成.bat文件,则要用两个&#39;%&#39;,即&#39;%%&#39;
另:.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命令的输出当成文件,对每行输出进行解析,输出每行字符中&#39;=&#39;前面的部分
这个和前面的管道|有些相似。


Example 5:
for /F \"usebackq eol=A\" %%i IN (`set`) DO @echo %%i//批处理
忽略以A开头的行,usebackq 表示`set`是一条cmd的命令,而&#39;set&#39;为字符串
注意,与上面的不同,&#39;set&#39;为字符串,`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下面有大量输出的软件,可以用批处理来筛选有用的信息
...
最后,也是最重要的一点:当MM请教你什么什么的时候,如果这时,你能show一把批处理命令,嘿嘿,MM想不认为你是电脑高手都难了。总之,批处理是非常实用的一门语言了


      对了,忘了说了:如果版主觉得我的这篇文章好,能不能给点威望?俺想求书可以发现一点威望也没有,多谢多谢了!
                                  -------Zhuwen

下面附件带有一个我编的批处理样例,用处是找出所有192.168.0.*子网内的PC,结果记录在c:\\1.txt中
[p:1]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

发表于 2005-8-11 23:21:30 | 显示全部楼层
内容不错,文笔也幽默,又是原创,加上是新朋友,威望鼓励,但发帖前请看版规,不要在帖子里申请加分,谢谢
回复

使用道具 举报

mbookworm 该用户已被删除
发表于 2005-8-12 01:28:55 | 显示全部楼层
这个得顶一下。
顺便推荐一本书
Microsoft.Windows.Shell.Script.Programming.for.the.Absolute.Beginner.chm
讲的就是批处理编程。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|网上读书园地

GMT+8, 2024-11-19 15:39 , Processed in 0.180159 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表