Board logo

标题: 批处理程序开发简述 [打印本页]

作者: cjiabing    时间: 2010-10-21 01:01     标题: 批处理程序开发简述

哈哈,写得烂了!不敢写太好了,否则我辛苦人家赚钱了!~大家批评指正!~

批处理程序开发简述


——以批处理版Mplayer播放器开发为例



批处理版音视频播放器 V4.1 ...




    一、批处理的优势
    批处理是对某操作进行批量处理的DOS命令脚本,它基于DOS或WINDOWS,命令简单而适应性强。批处理玩家常常引以为豪的就是,在任何一台普通的PC上,无需借助任何第三方,只需要系统自带的一个简单的记事本程序就可以编写强大的DOS命令脚本。批处理,顾名思义,批量处理,因此,它可以减少许多人工重复的操作,提供效率。
    批处理虽然基于简单的DOS命令,但因为它有条件判断——IF、循环命令——FOR、跳转命令——goto等等命令,因此,它也可以编写一些复杂而高级的程序。在使用批处理的时候,我们不要忘了批处理的优势,就是化繁为简,批量处理,简单实用。本文以开发“批处理版Mplayer播放器”来探讨批处理程序开发方面的一些问题。
    二、Mplayer支持批处理吗?
    Mplayer是一款开源软件,是一款强大的媒体文件播放器。在各作业系统安装的Mplayer都有不同的图形界面,然而,原版的Mplayer界面是基于命令行的。既然它以命令行的形式发布,我们就能通过DOS或者CMD对它进行操作。
    它在命令行下最基本的使用格式如下:
    Mplayer(完整路径名)+ 音视频(完整路径名)
    举例:
    C:\Mplayer\Mplayer.exe  D:\歌曲\卡农.mp3
    在DOS和CMD使用Mplayer不是很方便,因为你每播放一次你就得先设置一次Mplayer的路径,然后再设置歌曲的路径,相当的麻烦。批处理的优势就是化繁为简,批量处理,但遗憾的是,没有人为它制作一个批处理版的界面。
    今天,我们所做的就是为Mplayer建立一个批处理形式的界面,方便命令行下对该播放器的使用。同时,也为了证明批处理在程序开发方面的一些优势和能力。
    这属于批处理程序开发的目标和可行性分析。
    三、批处理能做什么样的界面
    既然要为Mplayer做界面,那么我们就得考虑批处理能做到什么程度,对所开发程序进行技术可行性分析。
    1、图。批处理基本上无法建立完美的图像,更无法实现视频一类的动画,除非采用批处理以外的其它模式。基于此,批处理无法建立非常丰富而漂亮的界面。但批处理还是可以显示抽象画的,画一些抽象的字符画无疑能为界面添加一些活力。而试图建立完美的动画则成了许多高手的挑战。
    2、形。批处理的界面只能现定于那一个黑框框内,无论是全屏还是将其缩小。但借助其它方式,它也可以获得提示信息、系统气泡、鼠标点击等等动作。
    3、色。把颜色独立出来是因为批处理在以上两项处于弱势的情况下它可以借助颜色提高界面的活力。批处理实现颜色的方式还是多种的,只是代码长短、效率高低的问题。
    4、声。喇叭声、语音、音乐、系统提示音,无论哪种批处理都能够实现。
    5、动。指操作。批处理只能进行命令输入——回车这种单调的工作吗?不,批处理借助第三方工具还是能够实现对鼠标的支持的。其实DOS对鼠标的支持已经证明了。
    除了第一项和第二项,后面三项批处理都能支持,只要处理得好,使用批处理还是能建立漂亮的界面的。
    四、程序结构
    程序应当包括以下三大部分:
    1、预处理与头部(start\head)。包括
1)程序信息摘要(rem);
2)预处理(call);
3)界面、菜单;
4)输入(input)与条件判断(if);
5)提示信息(echo)
    2、主体功能部(body)
1)play的基础:播放器路径设置;播放器搜索;
2)play的类型:由于Mplayer的参数较多,针对各种情况建立相应的播放格式。
    3、辅助功能与尾部(end)
1)辅助功能(CMD、BAT);
2)帮助说明(HELP、ABOUT);
3)退出(exit、quit)。
    五、程序流程图:
主要功能——辅助功能
输入:Input
       |
界面:Main——Start
       |        |
功能:Play—— Set——Help——CMD——BAT
       |        |
预处:MPP——Find
    六、标签名与变量名规范
    为了方便阅读代码、提高代码效率、减少错误,需要对代码的标签和变量进行规范。根据实际需要,标签名和变量名的规范应当遵循以下规则:
    1、标签名和变量名应当避开直接使用DOS命令。
    主要是为了避免误判。特别是在CALL之后,假如不细心的话,一些本来是标签的字符会被错当成命令执行了。可以使用相近的英文,如使用set不如使用sets、setting。
    2、避免与自身的或目录下其它文件的文件名、标题名等名称相同。
    这在某些命令中产生的错误会很突出。
    3、避免过短或过长的变量名和标签名。
    太短了不容易理解,太长了理解起来费时间,而且占字节。
    4、分类命名:
    1)以功能、意义、作用命名。代码用来做什么的就给它命名为什么。
    2)以数字或字母来命名。简单,但不容易理解,象征意义更大。
    3)以上两者组合。命名费时费力,但给主功能设置一个变量名,然后使用简单的数字或字母加以编号区别,使用短连接号“-”连接,这样,变量名或标签名既能省时省力,又提高了可理解性。如:%var_play%
    5、使用常用标签名和变量名。
    常用标签名如:menu、loop、end、a、1,等等。
    常用变量名如:%str%、%var%等。
    按一般意义来说,普通字符串应该都可以作为标签名和变量名,也就是不仅仅字母可以做标签名和变量名,中文、数字、符号等都可以做标签名和变量名。
    七、命令跳转类型
    以下是几种常用的标签调用类型:
    1、正向。批处理是从上而下逐行进行的。上下行的关系就是一个时间先后的关系。执行完第一行之后,意味着第二行要等第一行执行完才执行。
    2、GOTO——有去无回。跳转命令,会从一个标签跳到另外一个标签,从而打乱了批处理的上下行关系,使得批处理可以回头、循环执行。相对于CALL而言,GOTO只去不回,就是跳到某个标签后不会自动返回原标签。
    3、CALL——有去有回。CALL做跳转命令时有个特点,它调用一个标签之后在遇到“goto :eof”时自动返回原位置。这个特点很有意义,可以简化许多重复的代码,不用goto 跳来跳去。
    八、处理重复与代码优化
    批处理强调简单实用,在批处理代码本身亦如此。但在实际应用中,许多功能代码会反复被利用,甚至在同一个程序中反复出现,假如每次都写一遍的话一来吃力不讨好,二来使得代码臃肿,影响效率。那么如何处理重复和优化代码呢?
    1、考虑使用循环。
这个主要针对某些重复同样一个操作的情况,可以使用For和Goto loop来简化工作。
    2、考虑建立函数。
    应该叫子函数吧?就是某些类型的通用代码,比如全盘搜索文件,我们在许多批处理脚本中都会用到,假如说我们挑选出一个最有效、缺陷最少、最普遍性的代码,给它取一个固定的标签名,以后大家使用时直接就复制粘贴和CALL就可以了,不用每次写代码都要去重新写一遍相同的代码,从而提高了效率。即使在同一个程序内,也存在多次使用同一段功能代码的情况,此时将该段代码独立并建立标签是明智的。
    3、少用临时文件和变量设置。
    过多的临时文件和变量设置会严重影响效率。处理的方式是,在需要使用临时文件的地方考虑使用临时变量,在需要使用临时变量的地方考虑使用命令组合。在不延迟和不冲突的情况下,可以使用统一的变量名称。
    4、实用与效率意识。
    实用是第一的,但效率并非不重要。在实现了代码功能的前提下,考虑以更简单而高效的代码替换复杂而低效的代码是必要的功课。可以想得复杂些,但做要做得简单点。好的代码往往是非常简单而巧妙的。
    九、条件判断的类型与意义
    条件判断有三种类型:
    第一、存在判断——if exist。在进行文件操作时,最好先进行文件的存在判断。比如使用使用CD或START对文件进行操作时,不进行存在判断会弹出错误提示的。通常,存在判断后面的文件路径最好还要添加双引号。
    第二、赋值判断——if defined。该命令在某些场合是十分关键的。比如用来判断TXT文件是否为空等。它的否定形式与if “%var%”==”” 的功能类似。
    第三、比较判断——if “”==””等。不计较输入形式的情况下,建议打开“/i”。
    在进行某些数值比较时,数字位数超过两位数时,变量名可能不需要用双引号。而在进行某些字符比较时,不使用双引号会出错,特别是在变量截取的比较时。在大多数情况下,使用双引号是发现和解决问题的关键。
    第四、如果……否则(else)……。在某些情况下,这个假设判断是不能完全成立的,有时候前后两部分只能使用一半。
    与此功能类似的有管道符号:&&,假如前面的命令成功则执行后面的命令;||,假如前面的命令失败则执行后面的命令。当然还有返回码。
    在进行条件判断时,需要注意各IF所在的上下行位置,所使用的变量名是否延迟,是否使用双引号,所进行的判断在逻辑上是否成立和完整。
    十、必要的注释和结构化
    规范的代码反映思想的成熟,更能体现批处理作品的价值。
    在代码开头或者标签下面添加一两行的注释可以方便他人阅读,方便日后自己修改。注释不必多,简单就行。
    代码结构化是指代码的各个子部分以及整个流程应该是明朗的,有序的,不能杂乱无章。包括规范的标签名、变量名,干净流畅的流程,完美的跳转等等。
    有必要对代码进行缩进,使代码有层次感,方便阅读,更加美观。
    十一、代码错误检查
    代码出错时如何检查代码出错的位置?通常,代码较少的情况下使用“echo on”,代码较多的情况下使用两个命令:ECHO 和PAUSE。
    @echo on,是打开回显,你会看到代码执行的过程,特别是在FOR、IF、SET等情况下。
    在较庞大的代码中,一般会用到ECHO和PAUSE。方法就是,先使用PAUSE在可能出错的地方暂停,然后用ECHO 将有问题的代码显示出来。ECHO需用转义符(^)来处理(>>、&)等特殊符号。
    还有一种办法就是将出问题的部分代码独立拷贝出来执行,进行必要的修改。
程序是否可用,还需进行广泛测试。所谓的广泛测试就是在不同的计算机系统中是否能够正常运行。比较简单的有两种,一是将程序拷贝到桌面上是否可以执行?二是将程序拷贝到其它系统是否可以执行?
    十二、结语
    批处理所能做的不应局限于CMD那个小窗口,黑色背景白色字,批处理可以更加丰富多彩。批处理也不应只局限于那些短而小的小工具,批处理可以做得更加复杂、庞大,处理更高级的任务。批处理不应只局限于那几十个命令,只要批处理支持的都应该拿来发展批处理。
    只要是化繁为简、批量处理的工作,批处理可以做得更多、更好。
    批处理的发展需要进一步探索、积累和规范。没有规范,批处理就难以真正的发展壮大起来,永远都只能处于小而乱的局面。

[ 本帖最后由 cjiabing 于 2010-10-21 15:39 编辑 ]
作者: Batcher    时间: 2010-10-21 12:35

如楼主所说,建议大家学习一下变量命名的规范,这是程序员的基本素质。
可以google一下:匈牙利命名法、骆驼命名法、帕斯卡命名法
作者: cjiabing    时间: 2010-10-21 15:30     标题: 回复 2楼 的帖子

谢谢指点!~
匈牙利命名法:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。命名要基于容易记忆容易理解的原则。保证名字的连贯性是非常重要的。
骆驼式命令法,正如它的名称所表示的那样,是指混合使用大小写字母来构成变量和函数的名字。下划线法。
帕斯卡命名法,是在命名的时候将首字母大写
作者: hbwazxf    时间: 2011-3-8 09:35

很好。很强大。哈哈。。。收藏了。。。
作者: jay_16    时间: 2011-4-2 12:03

好强大呀。难以相像的强大。。。。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2