![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-13 17:31 |
共 47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行 |
| DOS学习入门 & 精彩文章 (教学室) » 转贴:批处理文件应用技巧 |
| 可打印版本 1,554 / 4 |
| 第1楼 Lydong | 发表于 2003-02-24 00:00 |
| 元老会员 发帖 407 积分 1,468 来自 广州 | |
|
转贴:批处理文件应用技巧 批处理文件应用技巧
虽然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的文件是用户所不想显示的。 @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 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 ——摘自:远望资讯 |
|
| 第2楼 HR130 | 发表于 2003-03-31 00:00 |
| 初级用户 发帖 16 积分 172 | |
|
谢谢!!!
|
|
| 第3楼 zgzjwz | 发表于 2004-05-18 00:00 |
| 初级用户 发帖 28 积分 227 | |
|
已收藏
|
|
| 第4楼 willsort | 发表于 2004-05-19 00:00 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
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 这是个比较明显的失误,==左右的字符串没有添加引号之类必不可少保护字符。 另外,第六小节的实现有个更佳的技巧: @echo off 不过瑕不掩瑜,这仍然不失为一篇好文章。 |
|
| 第5楼 zhri | 发表于 2004-05-19 00:00 |
| 高级用户 发帖 153 积分 665 | |
|
太感动了。
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |