中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 批处理文件及命令[转帖] 上一主题 | 下一主题
tanglu_sd
高级用户




积分 948
发帖 271
注册 2002-12-13
来自 sd
状态 离线
『楼 主』:  批处理文件及命令[转帖]

批处理文件及命令  

  在DOS操作系统中经常可看到一些扩展名为BAT和文件,这是什么文件?有什么作用?是如何组成的?这就是本节所学习的内容。

批处理文件

  批处理文件就是把一系列常用命令象编程序一样写到一个扩展名为“BAT”的文本文件中,这样的文件就称为批处理文件。要运行这个批处理文件时,只要输入此处理文件的文件名并回车即可,批处理文件就会按照文件中的命令运行其全部或部分指定的命令。运用批处理文件可以简化工作,带来许多方便。

  批处理文件可用具有文字编辑功能的软件如EDIT、WPS、CCED等来建立,甚至用COPY CON命令也可以。

  批处理文件中可以包含如下命令和语句;DOS内、外部命令,扩展名为COM、EXE、BAT命令文件和批处理命令。

  文件名为AUTOEXEC。BAT的文件,称为自动执行批处理文件,是一个特殊的批处理文件。它在计算机启动时,将被查找许被自动执行。

批处理命令(简称批命令)

  1、ECHO命令

  功能:允许或禁止屏幕显示批文件中执行的命令。

  格式:ECHO[on|off|message]

  参数解释:

  ON允许以下的命令执行时将显示在屏幕上。

  OFF以下的命令执行时不显示在屏幕上。

  @ECHO..表示连此ECHO命令自身也不显示。

  ECHO+表示显示空一行。

  MESSAGE用户自行给定的信息,不论此时ECHO为ON或OFF状态,执行时该信息都将显示于屏幕上。

  2、REM命令

  功能:在批文件中加注释。

  格式:REM[string]

  参数解释:

  string 注释的内容,最多可达123个字符。

  3、CALL命令

  功能:从一个批文件中调用并执行另外一个批文件,执行完毕后返回到第一个批文件继续执行。

  格式:CALL[d:][path]filename

  参数解释:

  d:调用的批文件所在的驱动器。

  Path调用的批文件所在的路径。

  Filename所调用的批文件名。




批处理文件应用技巧  

虽然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




批命令中的子程序  

    大多数成熟的高级编程语言允许您把常用的例程建立成独立的模块即子程序,它保

留了代码的独立性,使程序模式化,便于组织.至少可以说DOS的批命令不完全支持子程

序,但在任何时候你都可以用GOTO命令调用子程序.

通常,GOTO命令用的标号还可以接受存储在环境变量中的标号,如:

SET LABELNAME=START

GOTO%LABELNAME%

通过在子程序的开始替换标号并在子程序结束的地方设置GOTO %RETURN%语句,你


可以在DOS的批命令中建立子程序.只要SET 一个环境变量RETURN,你可在批命令的任

意专访调用子程序.例如,你可以给标号赋值并在下一行调用该子程序,招生GOTO语句

跳至该子程序的开始处,程序结构如:

REM This set the environment
REM variable and calls the
REM subroutine
SET RETURN=HERE
GOTO SUB
HERE
SUB
REM
Place subroutine statements
REM below
GOYO %RETURN%

语句GOTO SUB传送到子程序SUB,在SUB中你可以执行任何语句.执行至

GOTO%RETURN%时,批命令返回控制到号HERE,因环境变量RETURN被复赋值为HERE,如果


每次调用SUB都 用叭一的标号(如RETURN),则可多次多处调用SUB.




批处理文件使用技巧  
董占山
      DOS的批处理文件十分有用,我们可以把经常使用的命令编写为批处理文件,由计算机来实现对系统的自动加载, 完成这些重复工作。今介绍几个批处理文件的使用技巧:

(一)应用DOS重定向功能

DOS的标准输入输出通常是在标准设备键盘和显示器上进行的, 利用重定向,可以方便地将输入输出改向磁盘文件或其它设备。如在批处理命令执行期间为了禁止命令或程序执行后输出信息而扰乱屏幕, 可用DOS重定向功能把输出改向NUL设备(NUL不指向任何实际设备): C:\>COPY A.TXT B.TXT > NUL。

命令执行结束不显示"1 file(s) copied"的信息。有的交互程序在执行时要求很多键盘输入, 但有时输入是固定不变的, 为加快运行速度, 可预先建立一个输入文件,此文件的内容为程序的键盘输入项, 每个输入项占一行。假如有一个程序ZB, 其输入项全部包括在文件IN.DAT中, 执行 C:\>ZB NUL 程序就自动执行。

(二)应用DOS管道功能

DOS的管道功能是使一个程序或命令的标准输出用做另一个程序或命令的标准输入。如把DEBUG的输入命令写入文件AAA, 用TYPE命令通过管道功能将AAA的内容传输给DEBUG, 在DEBUG执行期间不再从控制台索取命令参数, 从而提高了机器效率。命令为: C:\>TYPE AAA|DEBUG >BBB。

(三)子程序

在一个批处理文件可用CALL命令调用另一个子批处理文件, 当子批文件执行结束后,自动返回父批文件, 继续向下执行。如: A.BAT B.BAT,A调用B,A.BAT内容如下:

@ECHO OFF
CALL B
CD \BASIC
BASICA BG
@ECHO ON

(四)菜单选择功能

DOS功能调用31H或4CH所提供的一字节的返回码, 通过批处理子命令IF和ERRORLEVEL对返回码进行处理, 可达到自动执行一批命令的目的。在批处理文件中实现高级语言所有的菜单提示功能, 使批处理文件变得更灵活方便。先用DEBUG建立一个菜单驱动程序MENU.COM,对应地编写一个批处理文件LG.BAT。具体内容和方法见下表:

DEBUG
-A
-166C:0100 MOV DX,111
-166C:0103 MOV AH,09
-166C:0105 INT 21
-166C:0107 MOV AH,01
-166C:0109 INT 21
-166C:010B MOV AH,4C
-166C:010D INT 21
-166C:010F INT 20
-166C:0111 DB '******************************'0D 0A
-166C:0131 DB '* 1.Turbo Pascal 5.00 *'0D 0A
-166C:0151 DB '* 2.Turbo Basci 1.00 *'0D 0A
-166C:0171 DB '* 3.Turbo Prolog 2.00 *'0D 0A
-166C:0191 DB '* 4.Turbo C 2.00 *'0D 0A
-166C:01B1 DB '* 0.Exit *'0D 0A
-166C:01B1 DB '******************************'0D 0A
-166C:01F1 DB 'Your choice(0..4) : '24 0D 0A 1A
-166C:0209
-R CX
CX 0000
:108
-N MENU.COM
-W
Writing 0108 bytes
-Q
@ECHO OFF:
START
CLS
MENU
IF ERRORLEVEL 52 GOTO C
IF ERRORLEVEL 51 GOTO PRO
IF ERRORLEVEL 50 GOTO BAS
IF ERRORLEVEL 49 GOTO PAS
IF ERRORLEVEL 48 GOTO EX
CLS
GOTO START
AS
CD \TP5.00
TURBO
CD \
GOTO START
:BAS
CD \TB
TB
CD \
GOTO START
RO
CD \TPROLOG
PROLOG
CD \
GOTO START
:C
CD \TURBOC
TC
CD \
GOTO START
:EX
@ECHO ON


执行LG, 屏幕左上角出现一个菜单, 并提示用户输入选择, 当选择的功能执行结束,重新返回主菜单请求选择, 直到选择"0"号功能, 程序结束返回DOS。

(五)应用命令处理程序完成大量重复工作

DOS提供调用次级命令程序的方法, 可实现与子程序等效的功能, 在MS DOS3.3以前的DOS版本下非常有用。如你有一批FORTRAN源程序需要编译, 首先编写两个批文件MAKEOBJ.BAT、C.BAT, 然后执行MAKEOBJ, 即可把当前目录下的所有扩展名为.FOR的FORTRAN源程序编译成OBJ文件。这种方法迅速正确, 人机交互少, 减轻了程序员的

MAKEOBJ.BAT C.BAT
@ECHO OFF
ECHO COMPILE FORTRAN PROGRAMS.
FOR %%A IN (*.FOR) DO COMMAND /C C %%A
ECHO FINISH !
@ECHO ON @ECHO OFF
ECHO ------ COMPILE %1 ------
FOR1 %1; >NUL
FOR2 >NUL
@ECHO ON

正确熟练地应用批处理文件, 可以给你的工作带来事半功倍的效果。利用本文介绍的方法你可以方便地编写出一个应用系统的主控模块, 与高级编写的模块一样好用, 且更为简便。以上的程序均在PC/AT上通过, 操作系统为PC DOS3.30。


2003-3-8 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
mys
元老会员




积分 5170
发帖 1637
注册 2002-10-16
来自 广东佛山
状态 离线
『第 2 楼』:  

很好,写得很详细。可以说是精品。



我的网志
http://hzmys.blog.163.com/
我的网盘
firststep.qjwm.com
fsmys.ys168.com
ssmys.ys168.com
www.brsbox.com/fsmys
www.brsbox.com/ssmys
www.brsbox.com/ccdos
2003-3-8 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (2664429)  编辑帖子  回复  引用回复
闪猛
中级用户




积分 327
发帖 69
注册 2002-12-1
状态 离线
『第 3 楼』:  

非常感谢,正需要这方面的知识。

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

网络游侠


积分 127
发帖 11
注册 2003-2-6
状态 离线
『第 4 楼』:  

很老了。不过确实不错。

2003-3-9 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
chenall
银牌会员




积分 1276
发帖 469
注册 2002-12-23
来自 福建泉州
状态 离线
『第 5 楼』:  

好顶顶顶顶。



QQ:366840202
http://chenall.net
2003-3-9 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (366840202)  编辑帖子  回复  引用回复
liangjianan
初级用户




积分 109
发帖 1
注册 2003-3-12
状态 离线
『第 6 楼』:  

感谢tanglu_sd的讲解,但我还有些要请教:
在Win98启动盘中的Autoexec.bat里有这么两句:
set LglDrv=27 * 26 Z 25 Y 24 X 23 W 22 V 21 U 20 T 19 S 18 R 17 Q 16 P 15
set LglDrv=%LglDrv% O 14 N 13 M 12 L 11 K 10 J 9 I 8 H 7 G 6 F 5 E 4 D 3 C
不知何解
又:如何像98启动盘那样自动将光驱的盘符紧跟在硬盘盘符之后?

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




积分 113
发帖 3
注册 2003-3-20
状态 离线
『第 7 楼』:  

精品!!!

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




积分 157
发帖 13
注册 2003-3-20
状态 离线
『第 8 楼』:  

很有学习的价值,向你好好学习。

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




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

GOOD

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




积分 349
发帖 78
注册 2003-3-12
状态 离线
『第 10 楼』:  

很好很好,我很高兴。Thankyou!

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




积分 193
发帖 20
注册 2003-4-9
状态 离线
『第 11 楼』:  

好棒,谢谢!

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




积分 120
发帖 4
注册 2003-4-11
状态 离线
『第 12 楼』:  



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




积分 102
发帖 19
注册 2004-11-22
状态 离线
『第 13 楼』:  

精品!!!  
好棒,谢谢!

2005-1-8 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
13670767243
初级用户




积分 102
发帖 19
注册 2004-11-22
状态 离线
『第 14 楼』:  

set LglDrv=27 * 26 Z 25 Y 24 X 23 W 22 V 21 U 20 T 19 S 18 R 17 Q 16 P 15
set LglDrv=%LglDrv% O 14 N 13 M 12 L 11 K 10 J 9 I 8 H 7 G 6 F 5 E 4 D 3 C
上面的意思就是把等于号"="后面的所有字符赋给变量%LglDrv%.



2005-1-9 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
xlxlds
初级用户




积分 141
发帖 14
注册 2004-12-27
状态 离线
『第 15 楼』:  

不错 真有这方面的需要。!还有谁可以读懂下面=后的代码啊,知道的话,能说说这么看懂得?set LglDrv=27 * 26 Z 25 Y 24 X 23 W 22 V 21 U 20 T 19 S 18 R 17 Q 16 P 15
set LglDrv=%LglDrv% O 14 N 13 M 12 L 11 K 10 J 9 I 8 H 7 G 6 F 5 E 4 D 3 C

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

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


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



论坛跳转: