标题: 转贴:批处理文件应用技巧
[打印本页]
作者: MYS
时间: 2002-10-25 00:00
标题: 转贴:批处理文件应用技巧
批处理文件应用技巧
虽然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
作者: buddiyar
时间: 2006-7-12 19:34
呵呵 收了
还是觉得对如我这样的新手还是有用处的
呵呵谢谢先啦