MS-DOS 7 系统编程入门/命令行
第 2 章 命令行
MS-DOS 中的命令行以机器生成的提示符开始,然后隐含地由符号和单词填充,这些符号和单词必须根据特定的语法约定适合机器解释。最后按 ENTER 键将命令行初始化为一个驻留程序 - 命令解释器进行解释。不同解释器对语法约定的实现并不完全相同。
MS-DOS 7 提供了 3 个解释器:IO.SYS、COMMAND.COM 和 DEBUG.EXE。每个解释器都接受自己的一组命令,分别在第 4 章中描述 IO.SYS,在第 3 章中描述 COMMAND.COM,在第 6.05 部分中描述 DEBUG.EXE。由于加载程序 IO.SYS 仅处理配置文件中的命令行,因此用户首先会遇到 COMMAND.COM 所呈现的命令行。后者通常被称为驻留解释器,因为它永久地加载到计算机的内存中,因此始终准备执行从键盘输入的命令。
通过输入重定向(有关详细信息,请参见 2.04-02),可以强制解释器接受来自键盘以外的命令,例如来自命令文件。命令文件中的每一行实际上都是一个独立的命令行。通过输入重定向发送命令文件是唯一可以通过 DEBUG.EXE 解释器自动执行命令序列的方式(示例见 9.02)。
COMMAND.COM 解释器也可以通过输入重定向接受命令,但这并不是执行 COMMAND.COM 命令序列的最佳方式,因为它能够处理一种特殊类型的命令文件 - 批处理文件 - 无需重定向。COMMAND.COM 解释器从批处理文件中接受许多补充命令,这些命令不能从命令行或普通命令文件中执行。这些补充命令包括用其值替换虚拟参数和变量名称(2.03-03)、搜索标签和其他一些命令(3.02、3.14、3.21、3.27)。本书中,术语“批处理文件”仅用于此特殊类型的命令文件。批处理文件的示例显示在第 9.03 部分中。配置文件 AUTOEXEC.BAT(9.01-02、9.04-02、9.09-02)也是典型批处理文件的示例。
本章描述了定义命令行组成的最基本约定,这些约定在单独的命令行和命令文件中都适用。这些约定在一定程度上适用于 MS-DOS 7 中的所有三个解释器。解释器的特有功能也将介绍。除非另有说明,否则隐含的是主解释器 - COMMAND.COM - 对命令的解释。
每个命令行都处理一个或多个对象。例如,对象可以是一个单独的实用程序,用于执行所需的操作,也可以是命令解释器的内部命令。命令行中的数据必须足够充实,以精确地识别所处理的对象。为此,在任何公共目录内,不允许对象具有相同的名称:所有文件和子目录都必须取不同的名称。为了识别任何特定目录之外的任何对象,都会考虑该对象的路径。该路径可以显式指定,也可以默认设置。
主对象的名称及其可选路径应在命令行中首先指定,并可能在其后跟其他项目,包括其他对象的名称、参数、引用、语法标记等。第 9.03 节中介绍的命令文件中的每一行都可以作为命令行的示例。
但是,也有一些对象 - 内部命令、端口和其他一些对象 - 无法通过路径规范进行定义。这些对象的名称必须是唯一的保留字,不能分配给任何其他对象。因此,首先要考虑的是用户可以为哪些对象分配名称,以及哪些对象不能分配名称。
保留字代表每个解释器特有的内部命令的名称,以及在特定计算机中声称存在的设备的名称。这些对象的名称不能更改或分配给其他对象。但是,应该了解这些保留字,以防止尝试将这些名称分配给用户可以命名的其他对象。
内部命令是特定解释器本身执行的命令。只要命令行由 COMMAND.COM 解释,第 3 章中描述的所有这些内部命令的名称都被视为保留字。例如,您不能将名称 PROMPT 分配给文件,因为 COMMAND.COM 在命令行中遇到此名称时,会将其“理解”为自己的内部命令,并且不需要做任何事情,只需执行此命令即可。其他命令解释器也类似地不允许将它们的内部命令的名称分配给其他对象。
PC 中设备的保留名称定义了获取数据的来源或发送数据的目标。最常见的设备名称是
AUX | – 第一个串行端口 |
COM1 | – 第一个串行端口(等同于保留名称 AUX) |
COM2 | – 第二个串行端口 |
CON | – 控制台,即键盘用于输入,显示用于输出 |
LPT1 | – 第一个并行端口 |
NUL | – 虚拟“无处可去”的输出端口 |
PRN | – 第一个并行端口(等同于保留名称 LPT1) |
除了这些设备名称之外,还有一些其他名称被视为保留名称:CLOCK$、COM3、COM4、CONFIG$、LPT2、LPT3。这些词语由集成到 DOS 内核中的设备驱动程序保留,即使相应的设备不存在于物理上,也会始终存在。可以通过 MEM.EXE 实用程序 (6.17) 显示您 PC 中声称存在的全部设备列表,前提是它以 /D
参数启动。此实用程序会显示一个表格,所有注册的名称都会显示在其第 4 列中。保留字会向右偏移 3 个空格,与其他名称区分开来。
几个可安装的软件驱动程序也可以通过名称识别并为其保留词语。例如,SETVER.EXE 驱动程序 (5.01-02) 保留词语 SETVERXX,HIMEM.SYS 驱动程序 (5.04-01) 保留词语 XMSXXXX0,EMM386.EXE 驱动程序 (5.04-02) 保留词语 EMMXXXX0。此外,当您为 CD-ROM 驱动器指定任意标识符时,例如 MSCD001(参见 5.09-01、5.09-02、5.09-03),DOS 会将此名称注册为保留字。如果稍后您尝试将此名称分配给文件,DOS 将拒绝您的尝试。
命名和重命名操作最常应用于目录 (3.19、6.20) 和文件 (3.24、3.25),包括普通文件和可执行文件。DOS 中的名称最多包含 8 个字符,并且可以附加一个最多包含 3 个字符的扩展名(后缀)。后缀用点与名称分隔。当分配了后缀,但特定操作不需要它并且省略时,点分隔符也必须省略。
名称和后缀都可以由字母、数字和在命令行解析中没有专门功能任务的几个符号组成:井号 (#)、美元符号 ($)、和号 (&)、减号 (–)、感叹号 (!) 、下划线 (_) 和其他几个符号 (2.04-06)。除要与命令 IF (3.15-02)、SEARCH (6.05-16) 和 FIND (6.14) 进行比较的字符串中的字母外,大写字母和小写字母在几乎所有操作中都被视为等效。
由于点 (.) 用于分隔名称和后缀,因此不允许将其用作普通字符。其他禁止的符号包括逗号 (,)、冒号 (:)、分号 (;)、等号 (=)、问号 (?)、加号 (+)、左箭头 (<)、右箭头 (>)、星号 (*)、管道 (|)、斜杠 (/)、反斜杠 (\) 和双引号 (" )。除非通过 COUNTRY 命令 (4.05、5.02-01、A.02-5) 取消了对国家语言符号的用法限制,否则也不允许使用国家语言符号。
目录名称通常没有后缀。文件名称中的后缀用于指示文件的类型或来源。三个后缀:BAT、COM 和 EXE 具有特殊状态,因为 COMMAND.COM 解释器识别它们属于可执行文件。当命令行中指定带有这些后缀之一的文件名时,COMMAND.COM 会自动尝试执行该文件代码。如果存在除有效可执行代码以外的其他内容,则计算机很可能会“挂起”。这些后缀不应分配给肯定不是可执行且有效的文件。
其他后缀的分配并不那么关键,但仍应遵循常见限制。文件管理器能够将文件与特定扩展名链接到专用应用程序,例如,后缀为 BAS 的文件可能会自动发送到 BASIC 语言解释器以供执行。将每个文件自动定向到相应的程序很方便(6.25-03、6.25-04 中的示例)。后缀还有助于直观识别基本文件的类别。以下列表显示了一些常见于 DOS 环境中的后缀关联。
BAK | – 存档或文件的旧版本 |
BAT | – 批处理文件,可由 COMMAND.COM 解释 |
BIN | – 需要固定放置的可执行文件 |
BMP | – 光栅图像文件 (位图) |
CAB | – 用于软件分发的压缩文件 |
COM | – 没有头的可执行文件 |
CPI | – 包含 DOS 字体数据的库文件 |
DAT | – 各种类型的非文本数据文件 |
DOC | – WORD 编辑器生成的文本文件 |
DLL | – 可执行代码的动态链接库 |
EXE | – 带有头部控制数据的可执行文件 |
EXT | – 功能扩展的规范 |
GIF | – 图形图像文件 |
HTM | – 用超文本标记语言编写的文件 |
INI | – 包含初始化数据的文件 |
JPG | – 按照 JPEG 规范压缩的图像文件 |
RAR | – 由 RAR.EXE 打包的压缩存档文件 |
RTF | – 富文本格式的文本文件 |
SCR | – 包含命令行的文件,可由 DEBUG.EXE 解释 |
SYS | – 系统文件,可以是文本文件或可安装文件 |
TMP | – 临时文件 |
TXT | – 非格式化的文本文件 |
ZIP | – 由 PKZIP.EXE 打包的压缩存档文件 |
可以在互联网网站 http://www.openwith.org/ 中找到许多其他后缀的关联。
2.01-03 文件掩码和通配符
[edit | edit source]问号 ( ? ) 和星号 ( * ) 被称为替换符号(或通配符),它们不能在名称和扩展名中使用,但可以用于替换命令行中名称和后缀规范中的字符。包含通配符的名称规范是文件掩码——一种一次性地解决多个文件的方法。
解析包含文件掩码的命令行时,COMMAND.COM 可能会调用通配符扩展功能,该功能会搜索满足遇到文件掩码的文件名。如果找到了这样的文件,它的名称将替换文件掩码,然后执行带有此名称的命令行。如果找到多个这样的文件,则会对每个找到的文件名依次执行类似的过程。
包含通配符的单词是否会被解释——这取决于要执行的命令:一些命令会调用上述通配符扩展功能,一些命令不会。通常情况下,通配符不会被忽略,但也有一些例外情况。
- 内部命令 ECHO、SET、TYPE 和 IF 使用相等比较功能(参见第 3 章)不会扩展通配符。
- 批处理文件参数中的通配符不会被扩展(无论使用 CALL 命令与否);
- 输入重定向符号(2.04-02)不会扩展通配符;
- FOR 命令(3.13)仅扩展括号内的通配符,但在括号之外,通配符将“按原样”传输到 FOR 循环中要执行的命令,通配符的进一步命运取决于该命令。
通配符 (?
) 表示一个符号,该符号会促使比较过程对任何单个字母或数字给出肯定响应。当文件名或后缀中的 (?
) 通配符后面没有明确指定的字母或数字时,比较过程也会对该位置的任何符号的缺失给出肯定响应。例如,在命令中
DEL readme.??
该对象将匹配当前目录中所有名为“readme”且后缀不超过两个字符的文件:readme.ru、readme.en、readme.f 等等。因此,DEL 命令(3.09)将从当前目录中删除所有这些文件。
星号 ( * ) 表示一个符号,该符号会促使比较过程对任何数量的任何后续字母或数字给出肯定响应,直到单词结束,单词结束可以是点或空格。例如,命令 DEL C:\TEMP\*.*
中的星号将匹配任何带有任何后缀的文件名,因此此 DEL 命令将应用于指定目录中的所有文件。
2.02-03、9.09-02 和第 9 章中几个其他批处理文件中展示了通配符使用的许多示例。
- 注意
- 搜索满足文件掩码的文件时是否会考虑属性——这取决于要执行的命令。例如,ATTRIB 命令(6.01)的通配符扩展包括所有文件,没有例外。
- 解释器 IO.SYS 和 DEBUG.EXE 不接受通配符。在 CONFIG.SYS 文件由 IO.SYS 解释时,问号被视为提示符,而不是通配符(参见 4.06、4.07、4.15、4.16、4.25)。
2.02 路径
[edit | edit source]每个文件在磁盘上的确切位置在某个目录中指定。通常,多个目录按层次结构排列:每个较高等级的目录不仅可以包含有关文件的信息,还可以包含有关几个较低等级目录(子目录)位置的信息。要访问任何文件,您必须指出磁盘和路径——即目录以及通向包含该特定文件的精确位置数据的目录的整个子目录链。
DOS 提供了机会(2.04-01、3.03)将任何一个特定路径指定为默认路径。此路径将存储在 DOS 的内部数据表中(A.03-3)。每次您在没有路径规范的情况下输入命令行时,DOS 都会考虑存储的默认路径。默认路径中指定的磁盘和最终目录(子目录)被称为当前磁盘和当前目录。DOS 的提示符(3.22)通常会调整以显示当前路径。
2.02-01 典型路径结构
[edit | edit source]默认情况下,命令解释器在当前目录中搜索所寻址的对象。如果对象必须在任何其他目录中找到,则对象的名称应以路径开头,例如
C:\DOS\MS7\Edit.com
其中
Edit.com |
– 是所寻址的可执行文件; |
C:\DOS\MS7\ – 是该文件路径的一个示例。 |
显示的路径规范指导搜索过程:首先应切换到磁盘 C 的根目录,然后进入 DOS 目录,然后进入其 MS7 子目录,最后在该子目录中搜索指定的可执行文件。如果您碰巧拥有其他目录结构,您将不得不指定其他名称,但原理保持不变:首先是磁盘的字母名称,后面跟着冒号,然后是一系列用反斜杠分隔的目录名称,最后是所寻址对象的名称。
以反斜杠结尾的规范在 MS-DOS 中被认为没有目标对象,因此不完整。此类路径将被忽略(参见 2.04-01)或被视为无效,除了一个特殊情况——路径缩减为单个反斜杠。磁盘字母名称后面的单个反斜杠表示指向指定磁盘根目录的路径。例如,A:\
表示指向磁盘 A 的根目录的路径。
没有磁盘字母名称的路径(例如:\DOS\MS7\Edit.com
)从当前磁盘的根目录开始计算,无论当前磁盘是什么。这对于编写媒体无关的批处理文件很重要(9.01-01、9.04-01、9.09-01)。单个反斜杠被解释为指向当前磁盘的未命名根目录的路径。使用以下反斜杠 CD \
更改当前目录的命令(3.02)将执行跳转到当前磁盘的根目录,无论它是什么。
当路径的开头既没有磁盘也没有根规范时,它将从当前目录开始计算。例如,路径 DOS\VC4\Vc.com
意味着第一个子目录 DOS 存在于当前目录中,否则会显示错误消息。
2.02-02 PATH 变量
[edit | edit source]为了使命令行使用更轻松,DOS 提供了另一种路径规范机制——通过 PATH 环境变量。当满足以下 4 个条件时,此机制就会生效。
- 命令针对 COMMAND.COM 解释器;
- PATH 变量已存在于环境中;
- 命令行中未指定路径;
- 在当前目录中找不到第一个所寻址的对象。
如果所有这些条件都满足,DOS 将沿着所有构成 PATH 变量值的路径搜索第一个地址对象。PATH 变量应事先使用内部 PATH 命令 (3.20) 设置。使用 PATH 命令进行路径规范的示例显示在 9.01-02、9.04-02、9.09-02 中。
借助 PATH 变量,您可以像这些实用程序始终存在于您可能选择的任何目录中一样轻松地调用它们以执行。这很方便,但仅在您碰巧在当前目录中遇到与版本相关的同义实用程序时才会发生,该实用程序属于 DOS 的其他版本。然后,后一个实用程序将首先被找到并失败,留下错误消息。关于如何避免此类冲突的不同方法在文章 5.01-02 和第 6 章的介绍文章中进行了讨论。这个问题也可以通过在命令文件或配置文件中指定完整路径来解决。此类解决方案的示例在第 9.03 部分给出。
2.02-03 路径规范中的点(s)
[edit | edit source]路径规范中的点(.)被解释为当前目录的别名。例如,请注意以下复制命令中替换目标路径的尾随点
Copy /B A:\MyDir\*.* .
有时批处理文件必须编写,以便在任何当前目录(事先可能未知)中执行其工作,然后点别名是唯一允许的替换,用于所需的目标路径规范到当前目录。当任何其他(非当前)目录将隐含为其他情况时,也需要使用点来寻址当前目录。
点作为路径语句的第一个符号意味着应该从当前目录开始计算路径
.\VC4\Vc.com
这样的路径等效于没有前导反斜杠的路径 (2.02-01),但无论如何这种形式的路径在批处理文件中可能很实用,因为 MS-DOS 没有其他方法来摆脱前导反斜杠。使用带有前导点别名和反斜杠的命令的另一个原因是,当执行同义实用程序可能会造成不希望的后果时,防止在 PATH 环境变量中列出的所有路径中搜索同义实用程序。
一些实用程序返回带有最终反斜杠的目录规范,例如
C:\DOS\MS7\
MS-DOS 将此类路径视为无效,并且 MS-DOS 没有提供摆脱最终反斜杠的方法。将点附加到此类路径可以解决问题
C:\DOS\MS7\.
- 此目录规范被视为有效。
双点,或点点(..
)可以像单个点一样在路径语句中的任何位置使用,但点点是父目录的别名。例如,如果您得到规范 C:\DOS\MS7\ 并想要寻址其父目录,那么规范 C:\DOS\MS7\..
恰好等效于 C:\DOS
。
在解析包含双点别名的路径时,DOS 只会抛弃路径链的前一个元素(最后一个示例中的 \MS7\
)。DOS 不检查抛出的元素是否存在,也不检查它是否代表文件或目录。这提供了一个机会,可以在执行期间获得的另一个文件的路径的基础上,在事先未知的目录中寻址一个新文件。此类寻址的示例显示在文章 6.25-03 中。
没有前导路径的双点被解释为相对于当前目录的父目录的别名,例如,在更改当前目录的命令中 (3.03)
Cd ..
为了向上爬两层目录结构树,您必须将双点组合两次
Cd ..\..
甚至更复杂的双点组合也可以用来导航和探索目录树。
2.03 命令行解析语法提示
[edit | edit source]2.03-01 分隔符
[edit | edit source]命令行中的单词用分隔符隔开:空格 ( )、逗号 ( , )、等号 ( = ) 和分号 ( ; )。虽然空格是最普遍使用的,但这些符号中的任何一个都被忽略在命令行的开头,并且将在解析操作中充当分隔符,包括解析 FOR 命令 (3.13) 中的对象列表。由于同样的原因,分隔符不能从命令行的参数传递到批处理文件的内部虚拟参数 (2.03-03)。
不过也有一些例外。SET 和 IF 命令以特殊方式使用等号 ( = ),不允许将其用于分隔。当逗号、分号或等号符号位于 ECHO 命令之前时,则显示部分行将从分隔符之后开始,包括可能的先前空格和单词 ECHO 本身。分号 ( ; ) 在 PATH 命令 (参见 3.20) 中用作特殊分隔符。
IO.SYS 解释器对分号的处理方式不同。分号被放置在 Config.sys 或 Msdos.sys 文件 (5.01-01) 中的行的首位,被解释为跳转到下一行的命令,忽略当前行的剩余部分(通常包含注释)。调试器 DEBUG.EXE 在汇编模式下以类似的方式处理分号:它忽略分号后的行的剩余部分,从而能够为 DEBUG 的命令文件添加注释 (7.01-05)。
2.03-02 斜杠
[edit | edit source]MS-DOS 命令行规范中的斜杠 ( / ) 是一个符号,用于将以下字母 (或单词) 解释为参数。例如,在命令 DEL C:\TEMP\*.* /P
(参见 3.07) 中,斜杠 ( / ) 强制将字母 P 解释为参数,从而在指定目录中是否应删除每个文件时提示。参数的精确位置和形式是特定的,必须符合特定命令的规范。有时,斜杠 ( / ) 在 FOR 命令中用作功能分隔符,导致以下单词中的字母转换为大写 (有关详细信息,请参见 3.13)。
2.03-03 百分号
[edit | edit source]批处理文件中的百分号 ( % ) 表示用相同参数或变量的值替换虚拟参数的名称或变量的名称。这些替换在执行指定的命令和重定向之前执行。
虚拟参数用数字 0 到 9 命名。第 0 个虚拟参数的值始终是批处理文件本身的名称;其他虚拟参数从命令行中指定的项目中获取其值,这些项目是从批处理开始的命令行中指定的项目。因此,例如,%3 将被替换为命令行中批处理文件名后面的第三个项目。如果多个虚拟参数在它们之间没有空格地指定,则替换后它们的值将被连接起来。将值分配给虚拟参数的示例显示在 2.03-04 和 9.03-01 中。
如果命令行中批处理文件名后面的单词总数少于 3,则虚拟参数的指定 %3 将被替换为空,并消失,不会出现任何错误消息。如果批处理文件名后面的单词总数大于 9,则可以通过对虚拟参数编号进行移位 (3.27) 来访问其余部分的值。不过有一个例外:Autoexec.bat 文件(例如,9.01-02),在 DOS 加载过程中自动执行,根本没有虚拟参数,因此 CALL %0 命令 (3.02) 不会导致其递归执行。
变量的名称必须是一个单词,第一个字符是字母(不是数字!)。变量的值要么由特殊的 SET 命令 (3.23) 分配,要么从父环境继承,该环境属于启动当前程序执行的程序 (参见 6.04)。为了执行替换,命令行中的变量名称必须两侧都用百分号包围 (例如,%VAR%
)。第 9.03 部分显示了包含环境变量的命令行的许多其他示例。
- 注意
- 如果百分号需要不进行替换地传递,则必须指定两次 (
%%
)。在解释命令行时,双百分号不会引起替换,它只是简单地转换为单个百分号。 - FOR 命令 (3.13) 使用它自己的局部变量;它在批处理文件之外的名称必须只用一个 (前导) 百分号指定。在批处理文件中使用时,该变量的名称需要两个前导百分号,例如,
%%A
,因为替换不应在 FOR 命令之前执行 (有关详细信息,请参见 3.13)。 - 其他解释器 (IO.SYS 和 DEBUG.EXE) 忽略百分号,不将变量和虚拟参数替换为它们的值。
2.03-04 双引号 ( " )
[edit | edit source]双引号 ( " ) 会禁用解释器解析命令行的功能,直到在同一行中遇到下一个双引号。因此,任何一组位于开始和结束双引号之间的单词(可能包括分隔符、重定向等)将被解释为一个项目。包含的双引号本身被认为属于包含的项目。例如,执行一行
C:\>Batch.bat 1 " 2 3 " 4 ""
创建一个新的虚拟参数集,其中第一个参数的值是单个数字 1,第二个参数的值是字符串 " 2 3 ",第三个参数的值是数字 4,最后一个第四个参数的值是一对空双引号。此虚拟参数集将存在,直到执行 Batch.bat 终止。将一组单词包含在双引号中是将这组单词整体(连同内部的任何符号)包含在一个虚拟参数的值中的一种方法。这个技巧尤其用于保持 DOS 中长名称的完整性。
一对空双引号 ( "" ) 被认为是一个特殊的空符号,可以使解析序列保持不变。大多数 MS-DOS 7 中的内部命令(除了 ECHO、IF 和 SET)都忽略一对空双引号作为单独的符号,但接受受双引号影响的解析结果。例如,命令
C:\>cd ""
如果在命令行中没有其他符号,则该命令将被执行。如果参数用双引号括起来,则命令将被执行,就像没有双引号一样。
C:\>cd "C:\dos"
在解析命令行时,不会检查结束双引号的存在,除了解析 FIND(6.14)和 FOR(3.13)命令的参数。FIND 和 FOR 命令以稍微不同的方式进行解析:任何用双引号括起来的单词组都被视为一个项目,但双引号不被视为属于该项目。因此,空配对双引号("")可以在 FIND 命令中用于计算文本文件中的总行数。出于同样的原因,FOR 命令可以去除包含的双引号,当这些双引号不再需要时。
方括号 [ ] 用作要由 DEBUG.EXE 和 IO.SYS 执行的文件中的特殊符号。方括号中的数据由 DEBUG.EXE 解释为对操作数的引用(有关详细信息,请参见第 7 章的介绍文章)。
在由 IO.SYS 加载程序执行的配置脚本 MSDOS.SYS 和 CONFIG.SYS 中,方括号中的单词以不同的方式解释:作为标题,标记单独配置块的开始,同时作为符号,包含此配置块的名称。有两个保留字表示 CONFIG.SYS 文件中的特殊配置块:[menu] 和 [common]。[menu] 块表示多配置菜单;如果存在,它必须放在 CONFIG.SYS 文件中第一个。菜单块因允许的命令的特殊子集而突出:MENUCOLOR(4.19)、MENUDEFAULT(4.20)、MENUITEM(4.21)和 SUBMENU(4.29)命令只能在宣布为菜单或子菜单的块中使用。除 NUMLOCK 命令(4.23)外,第 4 章中描述的所有其他配置命令都不能在菜单和子菜单块中使用。
要在所有配置中执行的命令分组在一个或多个具有相同名称 [common] 的块中。在块标题之外,配置块的名称在没有方括号的情况下引用(4.14)。具有 [menu]、[common] 和其他一些块的 CONFIG.SYS 配置文件示例分别显示在 9.04-01 和 9.09-01 中。
冒号 ( : ) 的解释取决于它在命令行中的位置。用作一行中的第一个字符(仅在批处理文件中),冒号 ( : ) 强制将紧随其后的单词解释为标签,标记跳转的目标地址点。这一行中可能有多个单词,但所有其他单词和符号将被忽略。批处理文件行首的双冒号 ( :: ) 有时用于禁用该行中指定的所有操作,包括重定向操作(2.04-02 – 2.04-05)。命令行中第二个位置的冒号 ( : ) 强制将前面的字母解释为磁盘的字母名称。如果命令行后面的部分为空,或简化为单个反斜杠,或包含在反斜杠中,则整行将不被解释为路径,而是解释为更改当前磁盘(使指定磁盘成为默认磁盘)的命令。例如,要使磁盘 A: 成为当前默认磁盘,您可以键入以下内容:
A:
或者
A:\
或者
A:\WINDOWS\
然后按 ENTER 键。更改当前磁盘不会更改该磁盘上的默认目录。如果目标磁盘上的当前目录是例如 A:\DOS,它将在上述每个示例中更改默认磁盘后保留其状态。在这些命令中,任何包含在反斜杠中的路径都不会被检查,甚至可能不存在。实际上,任何以反斜杠结尾的完整地址都适合作为当前磁盘更改命令。
左箭头 ( < ) 表示输入重定向操作,由 COMMAND.COM 解释器为执行命令行中左箭头符号左侧指定的程序而准备。默认情况下,标准输入通道 (STDIN) 与控制台 (CON) 相连,并接受来自键盘的输入。实际上,左箭头是将 STDIN(句柄 0000h)与输入重定向符号右侧指定的数据源连接的命令。当左侧指定的实用程序请求 DOS 通过 STDIN 通道进行数据输入时,它将从该数据源获取数据。当然,只有当实用程序要求通过 STDIN 通道进行输入时,这才能起作用。例如,命令
MORE < C:\DOS\Filename.txt
为过滤器实用程序 MORE.COM(6.19)提供从 C:\DOS 目录中指定文本文件读取的数据。如果省略目录规范,则隐含当前目录。在任何情况下,都不会沿着 PATH 变量中列出的路径搜索要读取的文件。不允许使用文件掩码代替源文件名,不会扩展通配符(2.01-03)。
除了文件之外,端口(LPT1、LPT2、COM1、COM2、COM3、COM4)也可以用作输入数据的来源。如果默认链接被 CTTY NUL
命令(3.07)破坏,则要从键盘执行输入,您必须使用输入重定向,并明确指定控制台 (CON) 作为数据源(3.07 中的示例)。
在任何情况下,输入重定向时,您都必须确保指定的数据源已准备好提供所需的数据。等待来自空闲、空闲或有缺陷数据源的数据输入很可能会导致挂起。
- 注意
- 重定向通过 JFT 表中的数据替换来安排(注释 3 到 A.07-1)。由 COMMAND.COM 为执行程序准备的重定向可能会被程序本身取消(9.07-02 中的示例)。
- 其他命令解释器(DEBUG.EXE 和 IO.SYS)忽略左箭头符号以及其他重定向符号(2.04-02 – 2.04-05)。但是,由 COMMAND.COM 准备的重定向被 DEBUG.EXE 接受(9.02 中的示例)。
右箭头 ( > ) 表示输出重定向操作,由 COMMAND.COM 解释器为执行命令行中右箭头符号左侧指定的程序而准备。默认情况下,标准输出通道 (STDOUT,句柄 0001h) 被定向到控制台设备 (CON) - 也就是说,定向到显示器的屏幕。输出重定向强制将 STDOUT 定向到另一个目标 - 右箭头符号右侧指定的目标。例如,DEL /?
命令(3.09)通常将联机帮助呈现给显示器,但当它后面跟着输出重定向符号时
DEL /? > Filename.txt
它的输出将不会到达屏幕,它将被写入指定的文件中。将自动创建一个具有指定名称(Filename.txt)的新文件,以便将重定向的输出写入该文件。如果存在同名文件,则它将被覆盖而不会提示,其以前的内容将丢失。
除了文件之外,可允许的重定向目标可能包括端口(LPT1、LPT2、COM1、COM2、COM3、COM4)、打印机 PRN(通常等效于 LPT1)、显示器 (CON) 和特殊准设备 NUL,它充当“黑洞”:任何输出都将永远丢失(3.21 中的示例)。这通常用于去除不需要的消息。
如果 STDOUT 通道和显示设备之间的默认链接被 CTTY NUL 命令(3.07)破坏,则仍然可以将输出发送到显示器,但需要明确地将输出重定向到 CON 设备(9.03-02 中的示例)。
输出重定向只能截获通过 DOS 的正常 STDOUT 通道发送的数据。通过 BIOS 的中断(8.01-17、8.01-21、8.01-33)、通过 DOS 的 INT 29(8.02-88)和通过 STDERR 通道发送的错误消息(句柄 0002h)无法被 STDOUT 重定向影响。
如果您在一行中组合输入和输出重定向,则主可执行命令必须首先放在后面,然后是带有完整源规范的输入重定向。输出重定向应在之后指定。组合重定向的示例显示在 6.14、6.25-03 和 9.03-02 中。
所有重定向符号 (2.04-02 - 2.04-05) 优先级高于普通操作,但标签 (2.04-01) 和双引号 (2.03-04) 除外。例如,在字符串输入命令 (ECHO、SET) 后,所有重定向符号都不会被处理为字符串的一部分,而是会导致重定向。由于同样的原因,重定向会忽略 IF 命令设置的条件,唯一可以有条件地执行重定向的方法是使用条件“IF...GOTO”跳转绕过其行 (3.15、3.14)。
即使同一行中的主操作无效、被禁用或根本没有输出,也会执行重定向。REM 命令 (3.24) 之后的空输出重定向通常用于创建零长度文件。
批处理文件作为一个整体的输出只能通过加载命令解释器 COMMAND.COM 的单独模块来重定向,使用 /C 参数 (6.04) 执行此批处理文件(示例 - 在 3.22、9.01-03 中)。如果没有启动新的解释器模块,批处理文件的输出可以在该批处理文件内部逐行重定向,但不能作为一个整体重定向。
重定向应谨慎使用,因为它可能会影响某些发送给用户的警告或某些操作的提示,除了预期的输出之外。例如,DIR /P 命令在每次屏幕满后停止其输出,并通过 STDOUT 发送一条消息,提醒用户输出将在任何按键后恢复。当此类消息和警告被重定向时,屏幕将保持空白,并且 PC 似乎已挂起。
2.04-04 双右箭头
[edit | edit source]双右箭头 (>>),就像单右箭头 (2.04-03) 一样,也是输出重定向的符号,但其作用不同,当重定向的目标文件已经存在时。重定向到双右箭头不会重新覆盖目标文件,而是将新数据追加到现有目标文件的先前内容。右箭头 (2.04-03) 输出重定向的所有其他特性也适用于双右箭头。
2.04-05 竖线(或“管道”)
[edit | edit source]竖线或“管道”分隔符 (|) 是中间重定向的符号,即从一个实用程序(或命令)到另一个实用程序(或命令)的数据传输。为此,COMMAND.COM 解释器专门创建一个临时文件。位于“管道”左侧的实用程序首先执行,其通过 STDOUT 通道 (通过句柄 0001) 的输出被写入此临时文件。然后控制权转移到位于“管道”右侧的实用程序(或命令)。当此实用程序发出通过 STDIN 通道 (通过句柄 0000) 接收数据的请求时,这些数据将从准备好的临时文件中获取。当后者的实用程序执行终止时,临时文件将被自动删除。
例如,以下命令序列可以避免询问用户是否真的要删除指定目录中的所有文件
ECHO Y | DEL C:\TEMP\*.*
首先,创建一个空的临时文件。然后执行 ECHO 命令,其输出消息(单个字母 Y)被写入该临时文件。然后执行 DEL 命令。找到 *.* 文件掩码后,它将发出请求以获得用户的许可并开始等待来自 STDIN 通道的回复。但是,由于其 STDIN 通道被重定向,因此执行不会被暂停:回复 - 字母 Y - 将立即从准备好的临时文件中读取。
在一条命令行中,可能有两个以上的命令通过“管道”链接。此类命令行的示例在 3.08 和 3.28 中显示。
如果“管道”符号后的命令不需要临时文件的内容,则“管道”符号前的命令不必将消息发送到 STDOUT 通道。因此,“管道”符号可以潜在地用作分隔符,可以在一行中指定多个命令。但是,不建议使用这种“管道”方法:FOR 循环 (3.13) 可以做到同样的事情,速度更快,并且无需访问可写磁盘来创建临时文件。
- 注意
- “管道”分隔符意味着在当前目录或环境变量 TEMP 指示的目录中创建临时文件。但是,当 DOS 从不可写入的光盘或任何写保护介质加载时,这两种尝试都可能失败。在这种情况下,错误消息会通知中间重定向无法执行。然后,在“管道”符号右侧指定的命令也不会执行。
2.04-06 “at” (@) 符号
[edit | edit source]在批处理文件的命令行中用作第一个符号时,“at”符号 (@) 被解释为一个命令,用于阻止在屏幕上显示此行。因此,几乎每个批处理文件都以“at”符号开头,后面跟着 ECHO OFF
命令。有时,这种操作不仅在第一行中是必要的(例如,在 3.13、6.25-02、6.25-03 中)。
- 注意
- DOS 并不限制在文件名中使用“at”符号,但错误地解释以“at”符号代替第一个字母的文件名可能会导致有害后果。