中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 转贴:批处理文件应用技巧 上一主题 | 下一主题
lydong
元老会员




积分 1468
发帖 407
注册 2002-10-21
来自 广州
状态 离线
『楼 主』:  转贴:批处理文件应用技巧

批处理文件应用技巧  

虽然Windows 3.x和Windows95应用越来越广泛,但DOS仍然为许多用户所钟爱。就DOS的批处理文件而言,许多用户在实际应用中却没有发挥其应有的作用,本文就DOS批处理文件的应用谈几点技巧,仅供读者参考。

1.显示选择的DIR信息

DOS的DIR命令为了便于用户显示一个目录中特殊类型的文件,提供了开关和通配符的功能。但是DIR命令也有许多不尽人意的方面,例如,如果我们要显示一个目录中除扩展名为.TXT以外的文件,则DIR命令就显得无能为力了。解决的方法是借助FIND命令来实现这一功能:

DIR /A-D | FIND/V “TXT”

“/A-D”开关是告诉DIR命令不要显示目录,管道命令“|”是指定所列目录按FIND命令的执行结果显示,/V开关是告诉FIND命令列出所有不包括双引号内字符串的所有行,双引号内的字符串要以空格为前导(空格是使FIND命令不能排除其所发现的基本文件名中包括字符串TXT的文件,如NEWTXT.DOC,所以空格在这里是不能缺少的)。实际上FIND命令可以在一行命令中多次出现,如显示一个目录中不包括扩展名为.TXT和.DOC的所有文件,命令如下:

DIR /A-D | FIND/V“TXT”FIND/V“DOC”

下面我们给出一个利用上述技巧的实例,该实例用以显示除指定扩展名以外的所有文件,这里假定文件名为NEWDIR,则命令格式为:

NEWDIR [扩展名1] [扩展名2]

其中扩展名为扩展名1和扩展名2的文件是用户所不想显示的。

@ECHO OFF

IF“%1”==“”GOTO NOPARAM

SET EXTENSION1=%1

SET EXTENSION2=%2

IF“%2”==“”SET EXTENSION2=.

DIR /A-D | FIND /V /I“%EXTENSION1%” | FIND /V /I “%EXTENSION2%” |MORE

GOTO END

:NOPARAM

ECHO No file extension specified. Syntax

ECHO is:

ECHO.

ECHO NEWDIR [extension1] [extenstion2]

ECHO.

:END

SET EXTENSION1=

SET EXTENSION2=

值得注意的是FIND命令后面增加了一个开关/I,这一开关的作用是使FIND命令忽略在命令行中键入扩展名的情况。

2.使输入自动化

在我们编写批处理文件时,有时需要在文件中指定日期,一般而言,我们在批处理文件中加入DATE命令,这样在运行的过程中程序就会提示用户输入日期。这里我们给出一种在DATE命令后面增加回车的方法:

ECHO. | DATE

ECHO. 用于向屏幕上发送一个回车,管道符号用于重定向回车到DATE命令。为了不显示DATE命令的提示,可以用下列命令:

ECHO. | DATE | FIND“Current”

如果想要在文本文件中增加一行日期,可以用下面的命令:

ECHO. | DATE | FIND “Current” >THISDATE.TXT

这种方法同样适合DOS的TIME命令和FORMAT命令。

3.屏蔽显示信息

在批处理文件中,“ECHO”和“|”配合是很有用的,这种配合有时可以消除我们所不希望见到的显示信息。例如在一个目录中删除所有文件,但又不想让系统显示“Are you sure(Y/N)”则可用如下命令:

ECHO Y | DEL *.* >NUL

在实际应用中,我们可以合理地配合使用ECHO和管道符,以使屏幕显示的内容符合我们的要求。

4.设置或重新设置路径

随着应用系统的增多,有些应用需要用户将它们所在的目录加入到PATH语句中,但PATH所支持的字符数不能超过127个字符,这样在具体应用中,有时就可能受到限制。这里我们通过一个例子探讨解决的方法、假设,我们所设置的路径如下:

PATH=C:\DOS;C:\UTILS;C:\BAT

而这时我们需要运行一种字处理软件,同时需要将路径设置成:

PATH=C:\DOS;C:\UTILS;C:\BAT;C:\TEXTEDIT

在运行完上述字处理软件后,还需要将路径设置成原来的样子,这里我们可以通过下面的批处理程序来完成:

@ECHO OFF

SET OLDPATH=%PATH%

PATH %PATH%;C:\TEXTEDIT

CD C:\TEXTEDIT

TEXTEDIT

SET PATH=%OLDPATH%

SET OLDPATH=

CD C:\

批处理程序的第二行是将现行路径保存在环境变量OLDPATH中;第三行合并路径;第六行在系统运行完成后,DOS将控制权交给批处理程序,这时将路径设置回原来的路径。通过这种方法我们就可以解决上述问题。

5.合理使用REM、::、和GOTO

在批处理文件中REM语句的作用众所周知,但在具体应用中可以使用::和GOTO代替REM语句,例如:

ECHO The following lines are remarks that will not be display

::This line will not be display

::Neither will this line

ECHO the batch file proceeds

同样可以使用GOTO语句实现上述功能:

ECHO The following lines are remarks that will not be display

GOTO JUMP

This line will not be display

Neither will this line

:JUMP

ECHO The batch file proceeds

一般而言,合理使用REM、::和GOTO将提高批处理文件的使用效率。通常当注释较短时,使用::或GOTO;当注释较长时使用REM。因为REM的执行时间和注释的长短无关,而::和GOTO在注释较长时执行时间将加倍。

6.将用户的输入转换成大写

编写批处理文件的人员都知道,IF语句对于大小写字母是敏感的,例如:

IF“%1”==“ERASE” GOTO ERASE

如果用户键入erase或Erase或者这五个字母的大小写任意组合,DOS将认为IF语句的条件没有满足,进而不执行GOTO语句。解决这一问题的办法是利用PATH命令,将用户输入的小写字母转换成大写,程序如下:

SET OLDPATH=%PATH%

SET PATH=%1

SET USERINPUT=%PATH%

SET PATH=%OLDPATH%

IF %USERINPUT%==ERASE GOTO ERASE

SET OLDPATH=

第一行将现行路径存储在环境变量OLDPATH中,第二行将PATH变量设置成用户输入,并将输入内容转换成为大写,第三行将一个环境变量设置成PATH(即用户输入的内容),第四行还原PATH的原有内容,第五行将转换后的字符串用于IF语句,最后一行清除OLDPATH环境变量。

7.FOR...IN...DO循环

在要求一次执行一个以上命令时,FOR...IN...DO的局限性就显示出来了。例如在批处理文件中,我们不能简单地通过MORE命令显示一个目录中的每一个文件,然后有选择地删除它们。下面的例子演示了克服上述问题的方法:

@ECHO OFF

IF“%1”==“:TASKS:” GOTO TASKS

FOR %%A IN (%1) DO CALL %0 :TASKS: %%A

GOTO END

:TASKS

CLS

MORE %2

DEL /P %2

:END

这里我们将这一批处理程序定名为LOOPER,如果我们要显示所有的文本文件而后给出一个删除选择,则可键入:

LOOPER *.TXT

这样在第一次执行时,第二行的IF语句检查%1是否包含:TASKS:;因为此次执行%1不包含:TASKS:,所以程序运行FOR语句。本例中,程序首先提出第一个扩展名为.TXT的文件而后执行CALL命令。假设第一个文本文件为ABC.TXT,则DOS执行如下命令:

CALL LOOPER :TASKS: ABC.TXT

即LOOPER带两个参数(:TASKS:和ABC.TXT)运行了自身的第二个拷贝。当LOOPER第二次运行时,再次检查%1是否包含值:TASKS:,而此次条件满足,LOOPER执行:TASKS:下面的程序段,MORE显示ABC.TXT的内容,而后DEL /P显示是否删除文件的选择。当:TASKS:例程执行完成,DOS关闭第二个LOOPER并返回第一个LOOPER的FOR ...IN ...DO语句,从而进行下一个.TXT文件的处理。

8.隐藏命令显示

许多DOS命令都要显示他们的结果,但有时由于这些结果显示在屏幕上会使用户眼花缭乱。如COPY FILE1.TXT FILE2.TXT屏幕上会显示“1 file(s) copied”,如果我们不想让系统显示这一信息,则可采用如下方法:

COPY FILE1.TXT FILE2.TXT>NUL

这种方法同样适合于批处理文件的暂停命令PAUSE,可屏蔽PAUSE命令的显示信息“Press any key to continue”。例如:

@ECHO OFF

ECHO There is no disk in drive A,Insert a

ECHO disk and press Enter.

PAUSE>NUL  
——摘自:远望资讯     




欢迎大家观临我的个人主页:

      http://dosdiy.bluepc.com.cn/
      http://dosdiy.ys168.com/


EMAIL: lydong@china.com.cn    lydong@yeah.net
----------------------------------------------
2003-2-24 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (89677127)  编辑帖子  回复  引用回复
HR130
初级用户




积分 172
发帖 16
注册 2003-3-31
状态 离线
『第 2 楼』:  

谢谢!!!

2003-3-31 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zgzjwz
初级用户




积分 227
发帖 28
注册 2004-5-15
状态 离线
『第 3 楼』:  

已收藏

2004-5-18 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 4 楼』:  

Re lydong:

  不错的内容,不过以下几点需要纠正:

  1,DIR /A-D | FIND/V “TXT”
  文中提到txt前需加空格防止find过滤掉主文件名中含txt的文件;但是忽略了长文件名中以txt开头的文件,所以txt前后都需要加上空格,避免find过分过滤。

  2,开关/I的作用是使FIND命令忽略在命令行中键入扩展名的情况
  此处应是笔误,开关i开关使FIND命令忽略字符的大小写,以兼容输入的大小写扩展名。

  3,第四小节中的例程的两句cd 
  既然C:\TEXTEDIT以被设定为搜索路径,那cd C:\TEXTEDIT就略显多余了,最后的cd c:\也处理的不理想,因为它没有恢复用户执行前的所在的路径。

  4,REM的执行时间和注释的长短无关,而::和GOTO在注释较长时执行时间将加倍
  这是个流传比较广泛的错误说法。恰恰相反,系统解释 :: 时,在第二个 : 处就会判定这是一个不合法的批处理标签名,而直接解释下一行语句。解释 goto 时,则只检测每行的的首字符是否 :,若不是直接解释下一行。而解释 rem 时,会扫描整行内容。只要在注释内容中加上文件输出的管道字符,便可以略窥他们的运行机制了。

  5,IF %USERINPUT%==ERASE GOTO ERASE
  这是个比较明显的失误,==左右的字符串没有添加引号之类必不可少保护字符。

  另外,第六小节的实现有个更佳的技巧:

  Quote:
@echo off
set %1=Enable
if [%option1%]==[Enable] goto swtich1
goto end
:switch1
rem content of switch 1
:end

  不过瑕不掩瑜,这仍然不失为一篇好文章。









※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-5-19 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhri
高级用户

zhri


积分 665
发帖 153
注册 2004-2-23
状态 离线
『第 5 楼』:  

太感动了。

2004-5-19 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: