跳转到内容

MS-DOS 7 系统编程入门/实用程序选辑

75% developed
来自 Wikibooks,开放世界中的开放书籍

第 6 章. MS-DOS 7 的实用程序选辑

MS-DOS 7 中命令解释器的功能由单独的可执行文件(实用程序)补充和扩展。Windows-95/98 操作系统版本中提供了一些 DOS 实用程序。如果本章中没有明确说明实用程序的来源,则表示它是这些 Microsoft 实用程序之一,通常可以在 \Windows\Command 目录中找到。除了这些之外,许多其他实用程序也可以在 MS-DOS 7 中成功使用,包括来自早期 DOS 版本的实用程序以及各种私人和非私人软件供应商编写的实用程序。

MS-DOS 实用程序包含内部帮助文本。当从命令行使用单个“/?”参数启动实用程序时,可以显示该帮助文本。很少遇到其他实用程序,它们在使用“–h”参数或根本不带参数启动时显示帮助文本。

某些 MS-DOS 实用程序会请求 DOS 版本号,如果 DOS 返回的版本号与预期版本号不符,则不会执行其任务。这并不一定是由于不兼容造成的:大多数此类特定版本实用程序在 MS-DOS 7 下都能成功运行,此时 Setver.exe 驱动程序 (5.01-02) 会将其表中的预期版本号替换为实际的 DOS 版本号。DOS 版本号不匹配可能会导致其他问题:当在当前目录中遇到属于不同 DOS 版本的同义实用程序时,无法通过 PATH 环境变量 (2.02-02) 寻址 MS-DOS 7 中的正确实用程序,因为 DOS 会首先在当前目录中开始搜索并找到不正确的实用程序。在 MS-DOS 7 中,特定版本的实用程序包括:Attrib.exe、Chkdsk.exe、Command.com、Debug.exe、Diskcopy.com、Doskey.com、Fc.exe、Find.exe、Format.com、Label.exe、Mem.exe、Mode.com、Sort.exe、Subst.exe、Xcopy.exe。这个问题有一个明显的解决方案:命令行中每个特定版本实用程序的名称前面都应加上完整路径。明智的做法是为使用正确指定的路径执行特定版本实用程序准备特殊的批处理文件或文件管理器菜单项(示例 - 在 9.03 中)。本章中提供的实用程序用法的大多数示例都不包含路径规范。这意味着 Setver.exe 驱动程序、PATH 环境变量值和文件放置已预先准备就绪,以便可以通过名称调用每个特定实用程序。

6.01 ATTRIB.EXE – 属性更改实用程序

[编辑 | 编辑源代码]

在目录中,每个文件都由一个记录表示 (A.09-1)。此记录中的属性字节 0Bh 指定文件的状态和访问权限 (A.09-2)。可以通过 ATTRIB.EXE 实用程序更改与特定文件相关的记录中的属性字节 0Bh,例如,以以下方式启动:

Attrib.exe +R –A C:\DOS\COM\*.txt /S

其中

+R –A 设置属性 R(只读)并删除属性 A(归档);最多可以指定四个属性:A、H(隐藏)、R 和 S(系统),每个属性前面都带有“+”(要设置)或“–”(要删除)。未提及的属性保持不变。
C:\DOS\COM\*.txt – 要处理的文件的路径和掩码规范示例(= C:\DOS\COM 目录中的所有文本文件)。如果未指定路径,则表示当前目录中的文件。可以使用特定文件名代替掩码。
/S 此选项规定继续在指定(或隐含的当前)目录的子目录中搜索要处理的文件。
注意
  1. 如果在命令行中未指定属性,则 ATTRIB.EXE 实用程序会显示已找到哪些请求的文件,并显示其特征(包括属性)的摘要。

6.02 CHKDSK.EXE – 磁盘检查工具

[编辑 | 编辑源代码]

CHKDSK.EXE 是一个用于分析和修复软盘和使用 FAT12、FAT16 或 FAT32 文件系统格式化的硬盘驱动器上的 FAT(文件分配表)的实用程序。通过比较第一个和第二个 FAT 表(以及目录)中的数据,CHKDSK.EXE 会发现交叉链接和丢失的簇。后者将转换为后缀为 *.CHK 的文件,并写入同一磁盘的根目录中。CHKDSK.EXE 完成检查后,会显示结果摘要。在没有参数的情况下执行时,CHKDSK.EXE 会使用默认设置检查当前磁盘。此外,您还可以指定以下选项

Chkdsk.exe C: /F /V

其中

C 要检查的磁盘的规范示例。
/F 立即修复找到的错误的权限。
/V 显示每个已处理文件的名称及其完整路径的规定。
注意
  1. SCANDISK.EXE 实用程序 (6.21) 执行 CHKDSK.EXE 执行的所有检查,以及一些额外的检查。因此,CHKDSK.EXE 仅作为信息实用程序,显示磁盘使用情况的摘要。
  2. CHKDSK.EXE 不应应用于网络驱动器、CD-ROM 和 Assign.com、Subst.exe 和 Join.exe 实用程序安排的虚拟磁盘。
  3. CHKDSK.EXE 实用程序不会检查文件是否可读或已损坏。
  4. 带有 /F 参数的 CHKDSK.EXE 实用程序不应应用于疑似感染病毒的磁盘:应首先应用防病毒程序。
  5. CHKDSK.EXE 实用程序不应应用于具有 4085 到 4087 个簇的磁盘,因为它可能会在这些磁盘中报告不存在的错误,并且尝试修复这些错误可能会破坏存储的数据。

6.03 CHOICE.COM – 选择输入实用程序

[编辑 | 编辑源代码]

CHOICE.COM 工具旨在通过命令解释器在批处理文件执行过程中安排交互式菜单。CHOICE.COM 接受从键盘或通过重定向发送的字符,然后根据该字符在一系列预定义选项中的编号设置 ERRORLEVEL 值(3.15-03,9.07-03)。以下是一个 CHOICE.COM 使用示例,其中包含其主要功能

Choice.com /C:YNC /T:C,10 Yes, No or Continue

其中选项为

/C:YNC /C: 参数引入一个要接受的字符列表。返回的 errorlevel 值对应于此序列中接受的字符的顺序,例如:Y – 1,N – 2,C – 3。当未指定 /C: 选项时,默认值为 YNY – 1,N – 2)。
/T:C,10 设置等待时间限制为 10 秒(允许 0-99),然后,如果未按下任何键,则将 C 选项作为默认选项(在此示例中,errorlevel 为 3)。当未设置时间限制时,CHOICE.COM 将无限期等待。时间限制 0 强制立即做出默认选择:因此,CHOICE.COM 工具可用于设置 errorlevel。
是、否或继续 - 显示在等待时间开始之前的可选提示的示例。如果行的最后部分包含一组单词,并且前面没有斜杠,则此组单词将显示为提示消息。

在提示消息之前,可以指定两个可选参数

/S 将选择字符视为区分大小写。
/N 不将显示的提示消息附加到备选选择列表和问号。

CHOICE.COM 返回的 Errorlevel 值在解释器内部命令的执行过程中保持不变,并且可以考虑以影响批处理文件解释的后续过程。Errorlevel 值可以在批处理文件的后续行中通过一系列“if errorlevel”条件(3.15-03)或在 FOR 循环(3.13)内检查,并将 errorlevel 值分配给环境变量,例如

FOR %%Z in (1 2 3) DO if errorlevel %%Z set Err=%%Z

以类似的方式,FOR 循环可用于使用“GOTO L%%Z”命令执行条件跳转,但为此目的,应以相反的顺序列出括号中的预期 errorlevel 值。

CHOICE.COM 工具的另一个完全不同的应用是单词解析。要解析的单词可以是路径,例如,如果需要检查指定磁盘的可写性、路径中每个目录的存在性等。假设文件 CHECK.BAT 包含一个分析程序,该程序需要逐个字母地呈现单词。为此,应按如下方式使用 CHOICE.COM 工具

ECHO ; | Choice /S /C:;Anyword; Call Check.bat > Temp.bat
Call Temp.bat

此处要解析的单词(例如:Anyword)括在分号中,这保证了首字母和尾字母的正确分离。此外,由于在允许的备选方案中存在重定向的答案(ECHO ;;),分号保证了不停的执行。提示消息由“调用 CHECK.BAT”一组单词表示。此输出消息发送到 STDOUT 后,将重定向到临时文件 TEMP.BAT。执行第一行后,创建的 TEMP.BAT 文件将包含以下字符串

Call Check.bat [;,A,n,y,w,o,r,d,;]?

显示的第二行调用 TEMP.BAT 文件的执行。在此执行过程中,要解析的单词的所有字母都将作为参数(从 %2 及其后)呈现给 CHECK.BAT,并且可以逐个单独分析。

注意
  1. 如果用户通过按下 CTRL-BREAK 或 CTRL-C 键组合来中断批处理执行,则 CHOICE.COM 工具将返回 errorlevel 0。
  2. 当用户按下任何其他键而不是预期键时,CHOICE.COM 会向控制台发送蜂鸣声信号(07h 控制符号)。
  3. 当 CHOICE.COM 遇到任何错误时,它将返回 errorlevel 255。

6.04 COMMAND.COM – 命令解释器

[编辑 | 编辑源代码]

命令解释器 COMMAND.COM 是一个驻留程序,它显示命令提示符,允许从命令行执行命令,以及自动执行批处理文件中的命令。文件 COMMAND.COM 包含第 3 章中指定的全部内部命令的代码。

COMMAND.COM 在最终启动阶段获得对 PC 的控制权,此时 IO.SYS 解释器在 CONFIG.SYS 文件中执行 SHELL 命令(4.26)。第一次执行加载 COMMAND.COM 的驻留模块,并使用全局变量安排其主(父)环境。之后,每次后续执行 COMMAND.COM 都创建一个派生(子)环境,继承前一个(父)环境中所有变量的副本。

与普通工具相反,COMMAND.COM 在其 PSP(= 程序段前缀,A.07-1)中不保留对父 PSP 的引用,因此父环境被隐藏保留,无法合法访问。重复执行 COMMAND.COM 可以更改本地环境变量并以其他方式执行应用程序文件(例如,逐步运行)。完成其任务后,最后加载的 COMMAND.COM 驻留模块可以使用 EXIT 命令(3.12)从内存中卸载。然后其派生(子)环境及其所有变量都将丢失,前一个(父)驻留模块的活动状态将恢复,并且前一个(父)环境再次可访问。

以下是如何加载命令解释器的示例,特别是为了逐步执行单个批处理文件

Command.com C:\dos\ CON /E:1008 /L:512 /U:255 /Y /C R:\Trial.bat

其中

C:\dos\ COMMAND.COM 文件的路径示例。此路径(带尾部反斜杠!)用于在新环境中编译 %COMSPEC% 环境变量的值。路径项应位于所有其他参数之前。如果省略路径,则 %COMSPEC% 变量将从父环境继承其值。
CON I/O 操作的设备规范示例。CON 代表控制台,即用于输出的显示器和用于输入的键盘。CON 是默认设备,因此可以省略其规范。其他设备规范(3.07)也允许,但所选设备必须准备好支持 COMMAND.COM 的交互活动。
/E:1008 为环境变量保留 1008 字节内存的可选规定(允许 256-32768)。默认环境的大小足以容纳所有继承的变量,但不少于 160 字节。
/L:512 内部缓冲区大小的可选规范,以字节为单位(允许 128-1024,默认值为 256)。此大小必须足够大,以容纳命令行以及所有显式值和命令的替换。
/U:255 输入缓冲区大小的可选规范,以字节为单位(允许 128-255,默认值为 128)。此大小设置原始命令行的最大长度(在进行别名替换之前)。
/Y 此选项强制逐步解释批处理文件中的行。当与 /P 参数(永久加载,见下文)一起使用时,将忽略 /Y 选项。
/C 此可选参数宣布以下名称是要执行的程序的名称,并且解释器的驻留模块必须在执行此程序后自动卸载自身。如果解释器的驻留模块应该保持加载状态,则应使用 /K/P 参数代替 /C/K 参数执行相同的操作,但允许稍后使用 EXIT 命令(3.12)卸载驻留模块。/P 参数不宣布程序的名称,它表示永久加载解释器的驻留模块,并且禁用 EXIT 命令。当 COMMAND.COM 首次使用 SHELL 命令(4.26)从 CONFIG.SYS 文件的一行加载时,/P 参数必须是命令行中的最后一个参数。
R:\Trial.bat - 要由 COMMAND.COM 解释器执行的文件的名称示例。可执行文件的名称可以在 /C/K 参数之后指定,这两个参数必须是命令行中 COMMAND.COM 的最后一个参数。所有后续参数(如果有)将被视为属于指定的可执行文件。

除了显示的参数外,COMMAND.COM 解释器还接受以下选项

/MSG 将错误消息文本加载到内存中。如果发生错误,阻止从磁盘读取消息文本,则此选项确保显示适当的错误消息。
/LOW 此选项强制将命令解释器的驻留模块加载到常规内存(低于 640 kb)。/LOW 参数与 /P 参数一起用于永久加载。
/F 此选项规定跳过对可能错误的查询,并继续执行,就像用户回答“失败”一样。/F 参数仅在与 /C 参数一起用于执行单个命令时才有效。但是,FOR 命令(3.13)在循环的所有操作中保持 /F 参数有效,并且 CALL 命令(3.02)在辅助批处理文件的所有操作中保持其有效。
/Z 此选项强制在执行任何返回 errorlevel 值的实用程序后显示 errorlevel 值。
注意
  1. /C 参数会影响用于终止批处理文件执行(1.03)的键盘功能。
  2. 当 COMMAND.COM 使用 /P 参数永久加载时,其第一个默认任务是解释 AUTOEXEC.BAT 文件,该文件隐含地存在于当前磁盘的根目录中。
  3. 当通过 SHELL 命令(4.26)隐式启动 AUTOEXEC.BAT 的执行时,AUTOEXEC.BAT 内部的 %0 参数无法用于启动递归。
  4. 使用 /K 参数加载后,COMMAND.COM 能够通过输入重定向(参见 2.04-02、2.04-05,以及第 6.05 部分引言文章的注释 1)接受来自其他进程或命令文件/的命令。
  5. 批处理文件(以 *.BAT 为后缀)与其解释器 COMMAND.COM 共享一个公共环境。普通可执行文件(以 *.COM*.EXE 为后缀)获取该环境的副本。

6.05 DEBUG.EXE – 调试器和微型汇编器

[编辑 | 编辑源代码]

DEBUG.EXE 是一个专门的命令解释器(调试器),由 Tim Patterson 编写,作为创建该操作系统的工具,该操作系统后来被微软收购,并被称为第一个版本的 MS-DOS。DEBUG.EXE 有助于发现和修复程序可执行代码和 PC 硬件设置中的错误。DEBUG.EXE 的功能不仅限于其内部命令集,因为这些命令能够汇编任何机器代码并立即执行它。当然,DEBUG.EXE 不是编写复杂程序的工具;它无法与高级语言竞争。但是,当您无法依赖已知的编译器时,当您必须检查某些内容或清除某些内容时,情况会决定其他标准。如果您在 CPU 的实模式下使用 DEBUG.EXE 执行此操作,则所有 AT 兼容计算机都会服从您的处置。您将直接访问磁盘、端口、内存和可执行文件内的代码。

启动 DEBUG.EXE 的命令行可能包含要加载的文件的名称,以便在启动时加载并准备好进行调试,例如

Debug.exe Trial.com /B /S

其中

Trial.com - 要检查的文件的示例,所有后续项目(在此示例中为“/B /S”)都被视为此文件(而不是调试器本身!)的选项。这些选项被写入文件的 PSP(= 程序段前缀),就像文件由解释器 COMMAND.COM 加载以执行时所做的那样。RAM 中文件的精确布局取决于文件的后缀(有关详细信息,请参阅文章 6.05-10)。

如果要加载的文件未在命令行中指定,则可以使用调试器的内部命令“N”(6.05-12)和“L”(6.05-10)稍后定义并加载。延迟加载提供了从任意地址开始代码布局的机会。这尤其对于组装和调试驱动程序非常重要(详细信息请参见文章 6.05-18)。

与 COMMAND.COM 解释器一样,DEBUG.EXE 激活命令行编辑键(1.05)并接受来自命令行的命令。如果存在任何重定向输入(2.04-02),DEBUG 会将其作为一系列命令而不是来自键盘的命令来接受。此功能能够将命令序列写入文本命令文件,然后将其发送到 DEBUG.EXE 以进行自动执行。

Debug.exe < Cmnd_txt.scr

所有要加载或写入的代码规范都可以包含在这些命令文件中(示例请参见文章 9.02、9.06、9.08、9.10)。

注意
  1. 当解释器从命令文件接受重定向命令时,它会失去通过 STDIN 通道与键盘的通信,因此无法通过中断 INT 21\AH=01h、06h、07h、08h、0Ah 执行数据输入(8.02-02、8.02-04、8.02-06)。由于同样的原因,如果命令文件最后一行没有恢复与键盘通信的命令,解释器可能会挂起。最常使用“Q”命令执行此任务,终止每个调试器会话。在不终止调试器会话的情况下恢复与键盘通信的另一种方法在文章 9.07-02 中进行了说明。
  2. Paul Vojta 开发了 DEBUG.EXE 的增强修改版。与原始的 Microsoft 调试器相比,主要区别在于增强修改版能够“理解”现代处理器的机器命令。包含增强调试器版本 1.13(2008 年)的存档 Debug113.zip 可以从以下网站下载:http://www.japheth.de/dwnload4.html。除非另有说明,否则第 6.05 部分中的所有后续文章同样适用于 Paul Vojta 的增强调试器。

6.05-01 DEBUG.EXE:命令和地址

[编辑 | 编辑源代码]

启动后,DEBUG.EXE 会显示其“–”(连字符)提示符。这意味着 DEBUG.EXE 已准备好接受命令。

调试器的命令由一个或两个字母的指令名称组成,后面可以跟由空格或逗号分隔的参数。如果在任何特定位置省略分隔符都不会导致歧义,则可以省略分隔符。DEBUG.EXE 将数字视为十六进制,将大小写字母视为相同;此规则的唯一例外是使用 SEARCH 命令(6.05-16)进行数据比较。

大多数情况下,命令名称后面的第一个参数指定起始点内存地址。它可以以完整形式表示——作为段地址和偏移量(例如,1FA5:0100),或显式引用段寄存器(例如,CS:0100),或以简短形式表示——仅作为偏移量(例如,0100)。在后一种情况下,段将由“A”(汇编)、“G”(执行)、“L”(加载)、“P”(继续)、“T”(跟踪)、“U”(反汇编)和“W”(写入)命令的 CS(代码段)寄存器定义;对于其他命令,它将由 DS(数据段)寄存器定义。长度小于 4 位的偏移量规范被视为具有前导零。例如,偏移量 100 被解释为 0100h。

所有段寄存器中的初始段地址都相同,由 DOS 在 DEBUG.EXE 请求时分配,以放置要调试的代码。此代码将不仅从分配段的开头写入,还将从由 IP(=指令指针)寄存器中的偏移量定义的某个偏移点写入。偏移量的初始设置是 0100h(即十进制 256)。分配段开头保留的 256 字节称为 PSP = 程序段前缀(详细信息请参见附录 A.07-1)。

如果调试器命令的操作针对一组字节,则该组由其起始点地址和长度或起始点地址(段:偏移量)和结束点偏移量定义。指定组大小(长度)的参数以字母“L”开头——例如,L20 指定一组 20h 字节。起始偏移量和长度的总和不得超过 FFFFh。如果长度规范位置的十六进制数前面没有字母“L”,则将其解释为同一段内的结束点偏移量。不允许为结束点指定单独的段。显然,结束点偏移量必须大于起始点偏移量。

键入命令后,用户通过按下 ENTER(或“CR”)键启动其执行。

最简单的调试器命令仅由单个字符组成,不需要过多注释。

Q(“退出”) – 终止调试器会话,退出到 DOS。
? – 显示调试器命令列表。

但是,显示的命令列表没有提供其用法的清晰指南。所有必要的指南都包含在本手册中,位于第 6.05 部分的后续文章中。

注意
  1. 如果键入命令时出错,DEBUG.EXE 会在下一行显示“错误”消息,并使用 ^(插入符号)指向它无法“理解”的第一个字符。大多数情况下,只有此字符是错误的原因,但有时原因可能是命令行前面部分的错误。
  2. 绝对内存地址计算为偏移量与段地址之和,乘以 10h(即十进制 16)。如果段地址例如为 1FA5h,偏移量为 0100h,则绝对内存地址将为 (1FA5h x 10h) + 0100h = 1FB50h。

6.05-02 DEBUG.EXE: “A”(= 汇编)命令

[编辑 | 编辑源代码]

“A”命令将 DEBUG.EXE 切换到将汇编语言指令(请参见第 7 章)转换为可执行机器代码。此代码不会立即执行,而是写入内存,从而形成一系列机器命令。翻译完成后,可以执行形成的序列或将其保存到文件中。以下是在调试器命令行中指定“A”命令的示例。

A 0100

ASSEMBLE 命令的字母名称后面是内存单元的地址,形成的机器代码的第一个字节应写入该地址。在所示示例中,此起始地址仅由偏移量表示,但可以以文章 6.05-01 中列出的任何允许形式指定。如果未显式指定段,则由段寄存器 CS: 定义。可以完全省略起始地址,然后由寄存器 CS:IP 的内容指向起始单元。

接受“A”命令后,DEBUG.EXE 会显示内存单元的完整地址,形成的机器代码的第一个字节将写入该地址,并显示一个闪烁的光标,从而邀请您键入要转换的汇编指令。此时,DEBUG.EXE 不会接受第 6.05 部分中描述的命令,而只会接受第 7 章中描述的汇编指令。用户通过 ENTER 键击确认每个汇编指令的结束。DEBUG.EXE 会转换输入的指令,将其机器代码写入内存单元,并在新行显示新的完整地址,邀请您键入下一个汇编指令。

要终止汇编指令的转换,您需要忽略调试器的邀请,并在该行为空时只按 ENTER。然后,DEBUG.EXE 返回到正常的交互操作,显示其连字符提示符,并再次准备好接受第 6.05 部分中描述的命令。如果 DEBUG.EXE 通过输入重定向从文件接收汇编指令,则应在此文件中留下一空行(7.01-04),此空行将强制 DEBUG.EXE 终止汇编指令的转换。

6.05-03 DEBUG.EXE: “C”(= 比较)命令

[编辑 | 编辑源代码]

“C”命令显示来自两个内存单元序列的非重合字节。跳过相同的字节。带有“C”命令调用的命令行可能如下所示。

C 113 L8 153

在字母名称“C”之后,第一个和第三个参数是要比较的字节所在的内存单元序列的起始地址。起始地址可以以任何允许的形式指定(6.05-01)。在所示示例中,两个起始地址都仅由偏移量表示,然后两个序列的默认段由段寄存器 DS: 定义。字母名称“C”后面的第二个参数定义第一个序列中最后一个内存单元的偏移量,或者要比较的字节序列的长度(如果数字前面有字母“L”)。在所示示例中,L8 表示长度为 8 字节。 “C”命令后的所有三个参数都是必需的。

6.05-04 DEBUG.EXE: “D”(= 转储)命令

[编辑 | 编辑源代码]

“D”命令显示一组内存单元的十六进制内容,同时在显示屏幕的右侧显示相同的内容,以 ASCII 码中的字符和符号表示。以下是在调试器命令行中带有“D”命令调用的示例。

D 19A9:02E0 L10

在字母“D”之后紧跟着一组要显示的第一个内存单元的完整地址。地址可以使用任何允许的格式(6.05-01)指定。如果未指定段,则由段寄存器DS: 定义。字母“D”之后的第二个参数定义该组中最后一个内存单元的偏移量,或者该组的长度(如果该数字前面有字母“L”标记)。在所示示例中,L10 表示长度为10h(即16十进制)字节。如果未指定第二个参数,则将显示80h字节(即128十进制)。如果两个参数都省略,则将显示80h字节,从当前偏移量开始,每次执行“D”命令时,当前偏移量都会增加显示的字节组的长度。这就是为什么每次执行“D”命令而不带参数时,显示的不是同一个字节组,而是下一个字节组的原因。由“D”命令显示的转储示例显示在图 8-12 中(在“附录”一章中)。

6.05-05 DEBUG.EXE: “E”(= Enter)命令

[编辑 | 编辑源代码]

“E”命令将新内容写入一个或多个内存单元。带有“E”命令调用的调试器命令行可能如下所示

E 0211

在所示示例中,字母“E”后面跟着内存单元的地址(偏移量),从该地址开始写入新数据。当未指定段时,它由DS: 段寄存器定义。地址可以使用任何允许的格式(6.05-01)指定,但不能省略。接受此命令后,DEBUG.EXE 将显示请求的内存单元的完整地址,并显示当前该内存单元中存在的数据字节。显示的行以一个点结尾,应将其视为提示,提示用户为该内存单元键入新的数据字节。ASCII 代码数据不被“E”命令通过键盘接受,数据应以每个字节两个十六进制数字的形式呈现。然后应按空格键。如果已键入新的数据字节,它将写入内存单元,但如果未键入新的字节,则将保留该内存单元的先前内容。无论哪种情况,DEBUG.EXE 都会显示下一个内存单元的内容,并邀请以相同的方式更改它。如果按下“–”(减号或连字符)键而不是空格键,则用户将有机会再次尝试更改先前内存单元的内容。为了终止数据输入,您必须按 Enter 而不是空格键。

如果在内存单元地址之后,在同一命令行中指定了新的输入数据,则“E”命令将以其他方式执行,而无需等待通过键盘输入数据,例如

E 03E0 'Data error' 0D 0A

命令行中的新输入数据可以以每个字节两个十六进制数字的形式表示,也可以以字符串形式表示,字符串用单引号或双引号括起来。两种表示形式可以以任意顺序交织在一行中。在写入内存之前,ASCII 字符将逐字节转换为十六进制形式,但包含的引号除外,引号不会转换也不会存储。如果一个字节由单个十六进制数字表示,则将其解释为较低的半字节,例如,“A”数字将被解释为0Ah。无论哪种情况,数据都将写入连续的内存单元,从指定的地址开始,按照它们在命令行中的放置顺序写入。

6.05-06 DEBUG.EXE: “F”(= Fill)命令

[编辑 | 编辑源代码]

“F”命令用单个字节或任何给定字节序列的重复记录填充一系列内存单元。在调试器的命令行中,“F”命令的调用可能如下所示

F 03E0 L2E 0D 0A 'Reserved' 90 90

字母“F”之后的第一个参数是要填充的内存单元序列的起始地址。尽管起始地址可以使用任何允许的格式(6.05-01)指定,但在所示示例中,它仅由偏移量表示,然后由DS: 段寄存器定义段。第二个参数指定内存单元序列的长度(如果该数字前面有字母“L”标记)或该序列中最后一个单元的偏移量。在所示示例中,声明了长度为2Eh 字节(46 十进制)。第三个和后续参数表示用于填充内存单元序列的字节序列。必须指定此序列中的至少一个字节。命令行中的数据可以以每个字节两个十六进制数字的形式表示,也可以以用单引号或双引号括起来的 ASCII 字符组的形式表示。

两种表示形式可以以任意顺序交织在一行中。在写入内存之前,ASCII 字符将逐字节转换为十六进制形式,但包含的引号除外,引号不会转换也不会存储。如果命令行中提供的数据不足以填充整个内存单元序列,则该过程将重复:后续单元将填充相同字节序列的副本。相反,如果内存单元序列太短,则填充过程将在最后一个单元处终止,不会出现错误消息。

6.05-07 DEBUG.EXE: “G”(= Go)命令

[编辑 | 编辑源代码]

“G”命令启动先前在内存中准备好的机器代码命令的执行。以下是在调试器的命令行中使用“G”命令的示例

G =100 143

跟随字母“G”之后的可选参数是地址。第一个地址前面带有等号,指向要启动执行过程的机器命令的第一个字节。尽管起始地址可以使用任何允许的格式(6.05-01)指定,但在所示示例中,它仅由偏移量表示;因此,默认段将由CS: 段寄存器定义。如果命令行中不存在前面带有等号的地址,则起始内存单元将由CS:IP 寄存器的内容指向。

那些前面没有等号的地址是断点。可以在命令行中为被测程序的不同分支指定多达 10 个断点。在调试器中,在断点指向的那些内存单元中,DEBUG.EXE 将原始机器代码替换为 INT 03 中断(8.01-04)的代码 CCh。

中断 INT 03 处理程序将控制权返回给 DEBUG.EXE,然后调试器在断点内存单元中恢复原始机器代码,并存储寄存器和标志的状态,从而准备进一步继续调试过程。为了成功终止所描述的操作,必须满足两个条件。首先,断点地址必须对应于机器命令的第一个字节,因为否则 CCh 代码将不会被解释为 INT 03 调用,而是被解释为先前机器命令的一部分。第二个条件是执行不应该以任何其他方式停止,除了准备好的断点之外,因为否则 DEBUG.EXE 将不会存储寄存器和标志的状态,不会恢复被替换的内存单元内容,并且被测程序将被破坏。您只能使用“L”命令(6.05-10)重新加载它。

如果您不打算应用断点,则有两种方法可以停止由“G”命令启动的执行。第一种是调用 INT 21\AH=4Ch 处理程序(8.02-55),它停止执行、终止调试器会话并将控制权返回给 DOS。第二种方法是调用 INT 20 处理程序(8.02-01),它停止执行,但不终止调试器会话。原始堆栈位置处的 RET 命令(7.03-73)也会引发具有相同后果的 INT 20 调用。DEBUG.EXE 重新获得控制权并开始从键盘或重定向接受下一个命令,具体取决于启动方式。在通过 INT 20 调用停止执行后,被测代码很可能不会被破坏,但寄存器和标志的最终状态将丢失。

6.05-08 DEBUG.EXE: “H”(= Hexadecimal)命令

[编辑 | 编辑源代码]

“H”命令计算并显示两个十六进制数字的和与差,每个数字最多为四位。在调试器的命令行中,它可能如下所示

H 12BA 00AE

在所示示例中,字母“H”之后的两个参数是用于计算的原始数字。其中任何一个或两个都可以包含少于四位数字,然后将隐含高位上的零。必须同时存在两个参数。

6.05-09 DEBUG.EXE: “I”(= Input)命令。

[编辑 | 编辑源代码]

"I" 命令读取指定端口的一个字节并显示在屏幕上。显示的字节无法写入其他位置或存储。命令行中“I”字母后跟一个参数,即端口地址,例如

I 03f8

与普通的内存地址不同,端口地址与段和段寄存器无关。端口地址只是一个最多四位的十六进制数。高位上的零可以省略。一些常用端口的地址列在附录 A.14-1 中。

6.05-10 DEBUG.EXE : the "L" (= Load) command

[编辑 | 编辑源代码]

"L" 命令从磁盘读取一系列代码并加载到内存中,从指定的地址开始。要读取的代码序列可以通过文件名或磁盘扇区数来定义。以下是一个使用 "L" 命令从文件加载代码序列的示例:

L 0100

所示示例中的唯一参数是内存单元地址,代码序列的写入应从该地址开始。地址可以用任何允许的形式指定(6.05-01),但当省略段时,它由 CS: 段寄存器定义。假定要读取的文件名已由 "N" 命令(6.05-12)写入 PSP(A.07-1)中,或者最初是从启动调试器的命令行参数传递到 PSP 中。此外,假定自将文件名写入 PSP 以来,DS: 段寄存器的内容没有更改,因此 "L" 命令仍然可以引用 DS: 中的段地址来从 PSP 读取该文件名。

可以省略“L”字母后的地址,然后代码序列将从地址 CS:0100 开始加载,但从后缀为 *.EXE 和 *.HEX 的文件加载除外。这些文件包含具有补充加载规范的头部。

*.HEX 文件头部后的补充偏移量将添加到默认取值(0100h)或“L”命令后指定的偏移量。对于 *.EXE 文件,将忽略“L”命令后指定的偏移量,不会加载 *.EXE 文件的头部。为了查看“按原样”加载的没有头部的文件或根本未加载的文件,应替换其后缀(最好替换为 *.BIN)。在任何情况下,文件的长度都存储在 CX 寄存器中。如果长度超过 64 kb,则长度的高位将写入 BX 寄存器。

要从逻辑磁盘的扇区加载代码序列,命令行必须包含四个必需的参数,例如

L 0100 2 0 1

第一个参数与前面的示例一样,是内存单元地址,代码序列的写入应从该地址开始。第二个参数被解释为逻辑磁盘号:0 – 磁盘 A:,1 – 磁盘 B:,2 – 磁盘 C:,依此类推。第三个参数表示要读取的第一个扇区的实际十六进制编号;第四个参数表示要读取的扇区数,以十六进制表示。一次最多可以读取 80h 个扇区。特别是,所示示例指定从逻辑磁盘 C: 读取扇区号 0(引导扇区)的一个扇区,并将内容写入从地址 CS:0100 开始的内存中。与从文件加载不同,从磁盘扇区加载不会导致将加载序列的长度写入寄存器。物理磁盘扇区超出逻辑磁盘范围,"L" 命令无法访问。

6.05-11 DEBUG.EXE : the "M" (= Move) command

[编辑 | 编辑源代码]

"M" 命令将内存中一个位置的数据块复制到另一个位置。在调试器的命令行中,“M”字母后必须跟三个必需的参数,例如

M 0100 L20 0180

在此示例中,第一个参数指定源数据块的起始地址,第三个参数指定目标内存空间的类似起始地址。这两个地址都可以用任何允许的形式指定(6.05-01)。如果地址仅由偏移量表示,则段由 DS: 段寄存器定义。命令行中的第二个参数表示源数据块的长度(如果数字前有字母“L”标记)或其最后一个字节的偏移量。这里第二个参数 L20 表示源数据块的长度为 20h 字节(十进制 32)。

如果源数据块和目标内存空间没有重叠,则源数据块中的数据保持不变。但是,当目标内存空间与源数据块重叠时,该块重叠部分中的数据将被覆盖,不会显示错误消息。在任何情况下,复制的顺序都选择为先复制要覆盖的字节。

6.05-12 DEBUG.EXE : the "N" (= Name) command

[编辑 | 编辑源代码]

"N" 命令声明一个文件名,该文件稍后将由 "L" 命令(6.05-10)加载或由 "W" 命令(6.05-19)写入。字母“N”后必须跟一个文件名,例如

N Trial.com /S /D

如果指定名称的后缀存在,则不能省略。文件名前面可以加上路径,后面可以跟一组参数(如所示示例中的“/S /D”)。

"N" 命令声明的所有数据都写入 PSP 区域(A.07-1)的地址 DS:0081 及其之后的位置。此外,写入字符串的长度存储在 DS:0080,不带后缀的文件名存储在 DS:005D,后缀存储在 DS:0065。由于提到的地址引用 DS: 段寄存器,因此在 "L" 或 "W" 命令请求写入数据之前,其内容不得更改。当执行 "N" 命令时不带参数,它会覆盖 DS:005C–DS:0080 内存单元中的数据,并在内存单元 DS:0081 中写入代码 0Dh。

注意
  1. CS: 和 DS: 寄存器的初始设置相同。因此,在默认地址 CS:0100 下加载被测程序可能会导致覆盖 PSP 数据(A.07-1),包括存储的文件名。此外,加载的代码本身也可能因 "N" 命令写入 PSP 的数据而损坏。

6.05-13 DEBUG.EXE : the "O" (= Output) command

[编辑 | 编辑源代码]

"O" 命令将数据字节发送到指定的端口。调试器命令行中的字母“L”后必须跟两个参数,例如

O 0378 00

第一个参数表示端口地址,第二个参数是要发送的字节。与普通的内存地址不同,端口地址与段和段寄存器无关。端口地址只是一个最多四位的十六进制数。高位上的零可以省略。一些常用端口的地址列在附录 A.14-1 中。

注意
  1. 不谨慎使用 "O" 命令可能会影响重要的 PC 设置并导致严重故障。

6.05-14 DEBUG.EXE : the "P" (= Proceed) command

[编辑 | 编辑源代码]

"P" 命令启动预先准备或加载到内存中的指定数量的机器指令的执行。如果执行由 "P" 命令启动,则循环(7.03-55 – 7.03-57)、子程序调用(7.03-08)、重复(7.02-03、7.02-04)和中断(7.03-28)不会逐一跟踪,而是像执行一条机器指令一样执行。此功能是 "P" 和 "T"(6.05-17)命令之间的主要区别。带有 "P" 命令的调试器命令行可能如下所示:

P =0100 5

"P" 字母后第一个参数是机器指令的地址,旨在启动执行。此地址可以用任何允许的形式指定(6.05-01),但必须以等号开头。如果地址仅由偏移量表示,如所示示例,则默认段由 CS: 段寄存器定义。第二个参数指定要执行的机器指令的数量。这两个参数都可以省略,然后只执行一条指令,即 CS:IP 指向的那一条。

机器指令执行后,“P”命令显示寄存器和标志的当前状态,并显示尚未执行的下一条机器指令的反汇编结果。

注意
  1. “P”命令不应该应用于直接从固定存储芯片或只读存储器 (ROM) 读取的机器指令。对于此类目的,应改用“T”命令 (6.05-17)。

6.05-15 DEBUG.EXE: “R” (= 寄存器) 命令

[编辑 | 编辑源代码]

如果在命令行中输入单个字母 R 并按 ENTER 键,则 DEBUG.EXE 将显示 CPU 主寄存器和标志的当前状态。下面图 1 显示了 DEBUG.EXE 启动时设置的寄存器和标志的典型初始状态。

图 1

需要注意的是,在所有显示的段寄存器 (DS、ES、SS、CS) 中,都写入了相同的十六进制数字:它是 DOS 为调试实验分配的内存空间的段地址。其他寄存器和标志获取预定的初始状态。标志初始状态的双字母表示具有以下含义

NV 无溢出;
UP 向上计数,或偏移量的增量计算;
EI 启用中断;
PL 正数;
NZ 非零值或不等式;
NA 第 4 位没有进位;
PO 奇校验,最低有效字节中位的奇数和;
NC 最高有效位没有进位。

显示消息的最后一行 (图 1) 显示了 CS:IP 指向的内存单元中的机器指令代码,以及该代码的反汇编表示。如果 DEBUG.EXE 使用默认参数给出“T” (6.05-17) 或“P” (6.05-14) 命令,则将执行此机器指令。

如果调试器命令行中的字母名称“R”后面跟着参数“F”,则您可能会获得更改标志状态的机会

R F

DEBUG.EXE 通过显示当前标志状态以及连字符(表示输入所需标志状态的双字母表示的邀请)来响应此命令。可以通过键入以下输入来设置与图 1 中显示的相反的标志状态

OV 算术运算后的溢出;
DN 向下计数,或偏移量的减量计算;
DI 禁用中断;
NG 负数;
ZR 零值或相等性;
AC 第 4 位有进位;
PE 偶校验,最低有效字节中位的偶数和;
CY 最高有效位有进位。

标志状态输入的顺序无关紧要。如果未指定某些标志的新状态,则这些标志将保留其先前状态。

为了获得更改寄存器状态的机会,调试器命令行中的字母名称“R”后面必须跟着该寄存器的名称,例如

R AX

显示的命令打开 AX 寄存器以写入新值。“R”命令还允许打开寄存器 BX、CX、DX、BP、SP、DI、SI、CS、DS、ES、SS、IP(以及 PC——它是同一 IP 寄存器的另一个名称)。收到显示的命令后,DEBUG.EXE 将显示该寄存器的先前内容和冒号,从而邀请您输入最多四个十六进制数字的新值。如果您不键入新数据而只是按 ENTER 键,则将保留该寄存器中的先前值。“R”命令不提供对 16 位寄存器的高字节和低字节(例如,AX 寄存器内的 AH 和 AL)的单独访问。如果要更改仅一个字节的状态,则必须为同一寄存器的另一个字节指定未更改的先前值。

注意
  1. 本文中提到的 8 个标志并非现代 CPU 中的所有标志。有关更完整的标志列表,请参见附录 A.14-4。

6.05-16 DEBUG.EXE: “S” (= 搜索) 命令

[编辑 | 编辑源代码]

“S”命令在有限的搜索区域内搜索指定的字节序列。字节序列和搜索区域都必须由调试器命令行中“S”命令后面的参数定义,例如

S 0100 L200 20 'st'

“S”后面的第一个参数是搜索区域的起始地址。尽管起始地址可以以其任何允许的形式指定 (6.05-01),但在所示示例中,它仅由偏移量表示,然后默认段由 DS:段寄存器定义。第二个参数指定搜索区域的长度(如果数字前面有字母“L”标记)或该区域最后一个单元格的偏移量。在所示示例中,声明了长度为 200h 字节(十进制 512)的长度。第三个和所有后续参数表示要搜索的字节序列。必须指定此序列的至少一个字节。

序列的字节可以用每个字节两个十六进制数字表示,也可以用括在单引号或双引号中的 ASCII 字符组表示。两种表示形式可以以任意顺序交织在一行中。在考虑之前,ASCII 字符将逐字节转换为十六进制形式,但包含的引号除外,这些引号不包含在准备好的序列样本中。在搜索过程中,大写和小写字母将被视为不同的字母。

搜索完成后,DEBUG.EXE 将显示搜索区域中找到所需序列的所有地址。重要的是要注意,DEBUG.EXE 不会分析找到的字节序列的任务。数据字符串和机器指令可能包含完全相同的字节序列。解决此类不确定性是用户的特权。

6.05-17 DEBUG.EXE: “T” (= 跟踪) 命令

[编辑 | 编辑源代码]

“T”命令启动预先准备或加载到内存中的指定数量的机器指令的执行。“T”命令可以跟踪循环、子程序调用、中断处理程序等内部的机器指令执行。此功能是“T”和“P” (6.05-14) 命令之间的主要区别。以下是在调试器命令行中使用“T”命令的示例

T =0100 5

“T”后面的第一个参数是要开始执行的机器指令的地址。此地址可以以其任何允许的形式指定 (6.05-01),但必须以等号开头。如果地址仅由偏移量表示,如所示示例中,则默认段由 CS:段寄存器定义。第二个参数指定要执行的机器指令的数量。这两个参数都可以省略,然后仅执行一条指令,即 CS:IP 指向的那一条。机器指令执行后,“T”命令显示寄存器和标志的当前状态,并显示尚未执行的下一条机器指令的反汇编结果。

注意
  1. 由于“T”命令跟踪循环、子程序调用和中断处理程序内部的机器指令执行,因此它可能涉及非常长的指令序列,需要花费太多时间来跟踪。在这种情况下,应优先使用“P”命令 (6.05-14)。

6.05-18 DEBUG.EXE: “U” (= 反汇编) 命令

[编辑 | 编辑源代码]

“U”命令显示从一组内存单元的可执行机器代码转换得到的汇编指令。使用“U”命令的调试器命令行可能如下所示

U 014B L10

“U”命令的第一个参数是所选组中第一个内存单元的地址。地址可以以其任何允许的形式指定 (6.05-01)。如果未指定段,则由 CS:段寄存器定义。“U”后面的第二个参数定义所选组中最后一个内存单元的偏移量或该组的长度(如果数字前面有字母“L”标记)。在所示示例中,L10 表示长度为 10h(即十进制 16)字节。如果省略参数,则将从 CS:段内的当前偏移量开始转换 20h 字节的代码。每次执行“U”命令时,当前偏移量都会增加转换的字节组的长度,以便每次执行“U”命令时,即使不带参数,也显示从不同的内存单元组中转换的代码。

需要注意的是,“U”命令无法区分可执行代码和其他数据,也无法找到长机器指令的第一个字节。当指定的起始地址不对应指令的第一个字节,或者当反汇编应用于数据时,则翻译结果会产生垃圾。图 2 中显示了两个反汇编的示例:第一个对应于起始地址 (0181h) 的正确指定,另一个显示了错误指定的后续结果。

图 2

如果起始地址指定不正确 (0180h),则偏移量为 0180h 和 0184h 的字节的翻译会产生无效结果,但在之后,反汇编的“阶段”会进入一个正确的稳定状态。如果翻译的机器指令是正确的并且 DEBUG.EXE 能够识别,则达到正确稳定状态的随机过程通常需要最多 10h 个字节,并且不会影响进一步的翻译。

当然,命令应该像处理器理解的那样进行反汇编。但是,相同的机器代码可以以不同的方式解释。差异的一个原因是短跳转指令的机器代码不包含跳转目标地址,而是包含相对于 IP 寄存器当前内容的目标偏移量。调试器通过将这些偏移量添加到 IP 寄存器内容来计算目标地址。后者取决于起始偏移量,即要反汇编的代码的第一个字节加载的偏移量。因此,除非要反汇编的代码像执行时一样加载,即对于驱动程序从 CS:0000 地址开始加载,对于 *.COM 和 *.EXE 程序从 CS:0100 地址开始加载,否则无法正确执行短跳转指令的反汇编。

处理器和调试器对机器代码解释的差异的另一个原因是处理器类型和状态的影响。解释取决于代码段描述符中的操作数大小字节。[注释 5 至 A.12-2] 此外,还有一些机器代码以 64 位处理器特殊的方式解释。但是,DEBUG.EXE 并不“知道”特定呈现的机器代码的正确处理器类型和状态。它只能反汇编为 16 位执行设计的那些机器代码。强制 DEBUG.EXE 反汇编其他机器代码毫无意义。

反汇编的无效结果可能是由调试器“不知道”的那些机器指令引起的。由于这个原因,不建议使用 Microsoft 版本的 DEBUG.EXE 来反汇编现代程序。在 第 6.05 部分引言文章的注释 2 中提出的 DEBUG.EXE 的另一个版本应该优先使用。当然,最近版本的“正规”反汇编器(IDA、SoftICE 等)要“聪明”得多,但无法提供可比的访问自由度,甚至无法在 DOS 下工作。对于那些被迫使用 Microsoft 版本的 DEBUG.EXE 的人,下面表格中给出了一些“未知”的机器代码。它的第一列显示了机器代码的第一个字节,这些字节由 DEBUG.EXE 显示为 DB 命令 (7.01-01) 的参数,位于单独的行中。第一个字节与第二列中给出的第二个字节通常足以理解操作的类型。如有必要,第四列中的名称和引用可以帮助查找有关特定指令的更多信息。

第一
字节
第二
字节
数据
字节
操作,指令
0F 00 1–3 任务寄存器的加载 (LTR)
0F 01 1–3 对寄存器 GDTR、IDTR、MSWR 的调用
0F 02 1–3 加载访问权限 (LAR)
0F 03 1–3 加载段限制 (LSL)
0F 05   系统寄存器的加载 (LOADALL)
0F 2(0–3)   MOV CR、MOV DR (7.03-58 的注释 1)
0F 4(0–F) 1–3 条件复制 (CMOV)
0F 8(0–F) 2 段内条件跳转
0F 9(0–F)   位的条件设置/重置 (SET)
0F A(0,8)   PUSH FS、PUSH GS (7.03-69)
0F A(1,9)   POP FS、POP GS (7.03-67)
0F A2   CPU 的识别 (CPUID)
0F A(4–7) 1–2 双字移位 (SHLD、SHRD)
0F B(2,4,5) 0–2 加载段寄存器 (LSS、LFS、LGS)
60     将 AX – DI 复制到堆栈 (PUSHA)
61     将堆栈数据弹出到 AX – DI (POPA)
62   3 数组边界的检查 (BOUND)
63   2 访问权限的调整 (ARPL)
6(4,5)     段前缀 FS:、GS: (7.02-01)
66     操作数大小前缀 (7.02-06)
67     地址大小前缀 (7.02-07)
6(8,A)   1–2 将数字压入堆栈 (PUSH,7.03-69)
6(9,B)   1–3 乘法 (IMUL,7.03-25 的注释 1)
6(C,D)     从端口组输入 (INSB、INSW)
6(E,F)     将数据组输出到端口 (OUTSB、OUTSW)
8(C,E) E(0–F)   MOV FS、MOV GS (7.03-58 的注释 2)
C(0,1) E(0–7) 1 SHL bl,0f、SHL bx,0f (7.03-82)
C(0,1) E(8–F) 1 SHR bl,0f、SHR bx,0f (7.03-83)

6.05-19 DEBUG.EXE: “W” (= 写入) 命令

[编辑 | 编辑源代码]

“W”命令将 PC 内存中的一段代码复制到逻辑磁盘上,可以是文件形式,也可以是直接写入磁盘扇区。以下是如何使用“W”命令将一段代码写入新文件的示例

W 0100

所示示例中的单个参数是内存单元地址,代码序列的读取应从此处开始。地址可以用任何允许的形式指定 (6.05-01),但当省略段时,默认段由 CS: 段寄存器定义。如果未指定地址,则代码序列的读取从 CS:0100 开始。代码序列的长度(从起始地址计算)必须事先准备好:长度的最低两位字节在 CX 寄存器中,最高位字节在 BX 寄存器中。

假设要创建的新文件的名称已由“N”命令 (6.05-12) 写入 PSP (A.07-1)。名称可以有任何后缀,除了 *.HEX 和 *.EXE,因为 DEBUG.EXE 无法为这些文件编译头文件。另一个假设是 DS: 段寄存器的内容自从将新文件的名称写入 PSP 以来没有改变,因此“W”命令仍然可以引用 DS: 中的段地址以从 PSP 读取此名称。如果准备好的名称前面没有路径,则将在当前目录中创建新文件。如果存在具有相同名称的文件,则会覆盖它,不会显示错误消息。

要写入逻辑磁盘的扇区,字母名称“W”后面必须跟四个必需的参数,例如

W 0100 0 0 1

这里第一个参数表示代码序列的起始地址,就像之前写入文件的示例一样。第二个参数解释为逻辑磁盘号:0 – 磁盘 A:,1 – 磁盘 B:,2 – 磁盘 C:,依此类推。第三个参数表示要写入的第一个扇区的实际十六进制数,第四个参数表示要写入的扇区的总十六进制数。一次最多可以写入 80h 个扇区。扇区的总数定义了写入的代码序列的长度,CX 和 BX 寄存器的内容将被忽略。特别是,所示示例指定将单个扇区号 0(引导扇区)写入逻辑磁盘 A:。物理磁盘超出逻辑磁盘的扇区无法通过“W”命令访问。

注意
  1. 当需要将 PSP 区域 (A.07-1) 中的一段代码写入文件时,在准备写入文件名称的备用内存空间之前,不能使用“N”命令声明文件名称。这可以通过将代码序列移出 PSP 内存区域或更改 DS: 段寄存器的内容来完成,以便文件名称不会覆盖 PSP 中的代码序列(文章 9.08 中的示例)。

6.05-20 DEBUG.EXE: “XA” (= 分配) 命令

[编辑 | 编辑源代码]

“XA”命令调用 EMM386.EXE 内存管理器 (5.04-02、8.03-59),请求分配常规内存之外的指定内存空间,并将十六进制引用号(句柄)分配给已分配的内存空间。除非 EMM386.EXE 内存管理器已加载且 1088 kb 以上的内存可用,否则无法执行请求的操作。在调试器的命令行中,“XA”后面必须跟所需逻辑内存页数(每个 16 kb),例如

XA 1A

所示请求的内存空间是 1Ah(十进制 26)个逻辑页,它们将从 00h 到 19h 编号。DEBUG.EXE 会以消息响应请求,例如“句柄已创建 0006”。因此,可以使用十六进制数 0006h 引用已分配的内存空间。但这对于访问已分配的内存空间还不够,必须执行另一个操作:“XM”命令 (6.05-22) 必须将已分配内存空间中选定的有限数量的逻辑页映射到物理可寻址内存空间上。

6.05-21 DEBUG.EXE: “XD” (= 释放) 命令“

[编辑 | 编辑源代码]

“XD”命令调用 EMM386.EXE 内存管理器 (5.04-02、8.03-61),请求释放由“XA”命令 (6.05-20) 分配的特定内存空间。假设 EMM386.EXE 内存管理器已加载并且 1088 kb 以上的内存可用。在调试器的命令行中,“XD”后面必须跟一个十六进制引用号(句柄),用于识别要释放的内存空间,例如

XD 0006

DEBUG.EXE 会对所示示例做出响应:“句柄 0006 已释放”。从那一刻起,句柄 0006h 变为无效,对已释放内存空间中逻辑页的访问将丢失,并且此空间将被视为可用。

6.05-22 DEBUG.EXE: “XM” (= 映射) 命令

[编辑 | 编辑源代码]

“XM” 命令调用 EMM386.EXE 内存管理器(5.04-02、8.03-60),请求将分配的内存空间中的一个 16 kb 逻辑页面映射到相同大小的“物理”页面上。这里的“映射”是指调整 CPU 中的地址转换机制,以便 CPU 将“物理”页面地址空间内的普通 16 位地址转换为该地址空间中对应于指定逻辑页面的部分的真实内存单元的 32 位地址。假设 PC 具有 32 位 CPU,内存量超过 1 Mb,EMM386.EXE 内存管理器已加载,并且“XA”命令(6.05-20)已为分配的内存空间分配了参考号(句柄)。

在调试器的命令行中,“XM”之后必须跟三个必需的参数,例如

XM 0B 03 0006

第一个参数——在本例中为 0Bh——是分配的内存空间中请求的逻辑页面的编号。第二个参数 03h 是“物理”页面的编号。第三个参数是分配给该分配内存空间的参考号(句柄),请求的逻辑页面属于该分配内存空间。

“物理”页面的编号可以选择从 00h 到 1Bh,但应注意,从 04h 开始的“物理”页面占据传统内存中的地址空间。因此,最常使用的“物理”页面是 00h-03h,它们默认分别对应于段地址 E000h、E400h、E800h 和 EC00h。但它们在地址空间中的位置可能会受到 PC 的 BIOS 要求和 EMM386.EXE(5.04-02)内存管理器的设置的影响。因此,在每种特定情况下,都应使用“XS”命令(6.05-23)或调用 INT 67\AX=5800h 处理程序(8.03-70)来检查“物理”页面的放置位置。

6.05-23 DEBUG.EXE: “XS”(= 显示)命令

[编辑 | 编辑源代码]

“XS”命令调用 EMM386.EXE 内存管理器(5.04-02、8.03-70),请求显示与内存使用情况和“物理”页面放置位置相关的数据。假设 PC 的内存量超过 1 Mb,并且 EMM386.EXE 内存管理器已加载。由于“XS”命令不需要参数,因此包含“XS”命令的命令行如下所示:

XS

DEBUG.EXE 通过显示一个表格来响应“XS”命令,该表格显示有效的参考号(句柄)以及每个句柄关联了多少个逻辑页面。然后,显示每个“物理”页面的段地址。最后几行显示统计信息:逻辑页面的总数、空闲逻辑页面的数量、最大可用句柄数以及已分配的句柄数。但是,如果表格包含 EMS 4.0 规范规定的所有 28 个“物理”页面有关的数据,则显示的表格将过长,无法容纳在屏幕上。为了查看表格的全部内容,您可以将输出重定向到文件(2.04-03),或设置视频模式 108h(A.10-1),或者通过 EMM386.EXE 驱动程序的设置(5.04-02)限制“物理”页面的实际数量。

6.06 DISKCOPY.COM – 磁盘复制实用程序

[编辑 | 编辑源代码]

DISKCOPY.COM 将一个软盘的全部内容(包括卷标和序列号)复制到另一个软盘上。两个软盘必须是相同类型的。以下是在配备两个软盘驱动的 PC 上复制软盘的命令行示例:

DISKCOPY.COM A: B: /V

其中

A 源软盘所在的驱动器的盘符示例;
B 目标软盘所在的驱动器的盘符示例;
/V 可选的验证复制操作的指令。

除了所示选项外,DISKCOPY.COM 还可以接受

/1 仅复制软盘一面的指令(适用于过时的单面可写软盘)。
/M 通过内存执行多遍复制的指令,当只有一个软盘驱动器可用且不应在硬盘上安排缓冲文件时。

如果计算机只配备了一个软盘驱动器,则必须为源和目标指定相同的盘符。在这种情况下,DISKCOPY 在由环境变量 %TEMP% 指定的目录中的硬盘上创建一个临时缓冲文件,然后提示用目标软盘替换源软盘,并将数据从缓冲文件复制到目标软盘。之后,缓冲文件将自动删除。但是,当未定义 %TEMP% 变量(或指定了 /M 选项)时,源软盘会被部分复制到可用的内存空间中,因此您需要在同一个软盘驱动器中多次交换源软盘和目标软盘。

DISKCOPY.COM 并非设计用于创建软盘的非临时文件映像。此外,DISKCOPY.COM 无法合理地处理损坏的扇区。由于这些缺点,如今更倾向于使用其他复制程序。例如,可以推荐 IMG.EXE 实用程序。包含 IMG.EXE 实用程序的存档文件 IMG.ARJ 可从服务器 ftp://ftp.elf.stuba.sk/pub/pc/utildisk/ 下载。

注意
  1. DISKCOPY.COM 和类似的软盘复制实用程序不能应用于硬盘驱动器、网络驱动器、CD/DVD-ROM 以及由 ASSIGN.COM、JOIN.EXE 和 SUBST.EXE 实用程序创建的虚拟磁盘。

6.07 DOSKEY.COM – 命令行管理器

[编辑 | 编辑源代码]

DOSKEY.COM 是 COMMAND.COM 解释器的命令行功能的驻留补充。DOSKEY.COM 能够编辑命令行文本,调用以前的命令,创建和执行宏命令,包括简单的操作序列。通过宏命令指定的程序在 DOSKEY.COM 将其定义加载到特殊的内存缓冲区后可用。除了该缓冲区外,DOSKEY.COM 的驻留模块还占用大约 4 kb 的内存。

MS-DOS 7 中的 DOSKEY.COM 相对于其以前的版本有所改变:它具有从文本文件加载宏命令定义列表以及增加键盘缓冲区和命令行编辑缓冲区大小的功能。

DOSKEY.COM 可以从命令行或批处理文件(AUTOEXEC.BAT 或其他)的行加载,可以直接加载,也可以使用 LH 命令(3.17)加载,例如:

LH Doskey.com /bufsize:1024 /insert /file:C:\DOS\MS7\Macro.scr

其中

/bufsize:1024 – 宏命令缓冲区的大小定义(最小为 256 字节,默认为 512)。当第一次加载 DOSKEY.COM 或使用下面描述的 /reinstall 选项重新加载时,应使用此选项。相同缓冲区的空闲部分用于存储以前的命令行(历史记录)。
/insert 将命令行切换到字符插入模式,允许在之前键入的字符之间插入每个后续字符。默认情况下为覆盖模式,后续字符将替换之前的字符。
/file:C:\DOS\MS7\Macro.scr – 是从文本文件加载宏命令定义的规范示例(后面给出了此类文件的示例)。如果该文件存在于当前目录中,则可以省略文件名之前的路径。此文件的文件名和后缀是任意的,但如果存在后缀,则必须指定。

加载操作允许的其他选项有:

/echo:off – 禁用在屏幕上显示执行的宏命令。
/keysize:31 – 增加键盘预读缓冲区的大小(默认为 15 字节)。
/line:256 – 设置命令行编辑缓冲区的大小(默认为 128 字节)。
/reinstall – 安装新的 DOSKEY.COM 驻留模块。这可能需要更改缓冲区的大小,或者为了恢复因与其他 TSR 实用程序冲突而丢失的功能。每次重新安装都会使占用的内存增加大约 4 kb(因为以前的 DOSKEY.COM 驻留模块无法卸载)。

如果 DOSKEY.COM 已经加载,则可以使用 /H 选项再次调用它,以显示存储的先前命令(历史记录):

Doskey /H

或者使用 /M 选项显示存储的宏命令:

Doskey /M

此外,还可以再次调用 DOSKEY.COM,以便从命令行将另一个宏命令定义加载到内存缓冲区中,例如:

Doskey count=C:\DOS\COM\Find.exe /v /c "" $1

这里,“count”一词被解释为新宏命令的名称。在命令提示符附近键入命令行中的此名称将启动执行宏命令定义中等于号右侧指定的命令。所示定义包含一个命令,该命令计算任何文本文件中行的数量,此处由虚拟参数 $1 表示。在宏命令执行过程中,虚拟参数将替换为在同一命令行中宏命令名称之后指定的实际文件名。

宏命令定义中的命令可以包含等号和变量值的替换(例如 %Temp%)。当在宏命令定义中遇到符号“$”时,它将与后面的字母(或数字)以特殊方式解释为:

$G – 输出重定向符号“>”(右箭头);
$L – 输入重定向符号“<”(左箭头);
$B – 中间重定向符号“|”(管道);
$T – 一个宏命令内命令之间的分隔符;
$1-$9 – 虚拟参数,等效于批处理文件中的 %1 – %9;
$* – 命令行中宏命令名称后面的所有单词;
$$ – 一个字符“$”(美元符号)。

用于加载宏命令定义的文本文件必须每行包含一个定义,例如:

count=C:\DOS\COM\Find.exe /v /c "" $1
newbat=echo @echo off$G %Temp%\New.bat $T Edit.com %Temp%\New.bat

您可以通过指定宏命令名称,后面只跟着一个等号来删除缓冲区中的任何已加载宏命令,例如:

Doskey count=

加载 DOSKEY.COM 后,它会激活以下“热键”:

向左和向右箭头 将光标向左和向右移动
CTRL-左箭头 将光标向左移动一个单词
CTRL-右箭头 将光标向右移动一个单词
HOME 将光标移动到命令行的开头
END 将光标移动到命令行的末尾
INS 切换覆盖和插入键盘模式
ESC 清除当前命令行
ALT+F10 从内存缓冲区中删除所有宏命令
F7 显示以前的命令列表(历史记录)
PageUp 从历史记录列表中调用最旧的行
PageDown 从历史记录列表中调用最新的行
向上和向下箭头

沿历史列表移动命令的选择
F9 按编号从历史列表中选择命令
Alt+F7 清除以前的命令列表(历史记录)
F8 如果历史列表中存在合适的名称,则在命令行中将字符追加到命令名称的其余部分。
注意
  1. 如果命令行中宏命令的名称前面至少有一个空格,则该宏命令不会被执行。
  2. 当宏命令与命令同义时,它会禁用后者(将执行宏命令)。
  3. DOSKEY.COM 与 TSR 文件管理器(Norton Commander、Volkov Commander 等)不兼容。通常更喜欢使用文件管理器。

6.08 DELTREE.EXE – 目录删除器

[编辑 | 编辑源代码]

DELTREE.EXE 是一款极其危险的实用程序,因为它可以删除目录及其所有子目录和文件,而不管文件属性如何。只有逻辑磁盘的根目录无法使用 DELTREE.EXE 删除。其使用方法示例如下:

Deltree /Y C:\TEMP\TDIR1

其中

/Y 一个选项,规定在不提示和确认的情况下删除。
C:\TEMP\TDIR1 – 要删除的目录的示例规范。一行中可以有多个这样的规范,但不允许使用通配符。

6.09 EDIT.COM – 编辑器实用程序

[编辑 | 编辑源代码]

EDIT.COM 是一款流行的双窗口编辑器程序,主要用于文本文件,但也具有有限的编辑二进制文件的功能。EDIT.COM 允许同时打开多达十个文件。图 3 显示了在 EDIT.COM 编辑器的单独窗口中打开的两个不同文件。

图 3

要编辑的文件可以根据 PC 的内存大小而定。EDIT.COM 设置了一个剪贴板,允许在打开的文件之间发送选定的文本部分。此外,EDIT.COM 能够与鼠标设备驱动程序配合使用,从而使编辑更加轻松快捷。

EDIT.COM 编辑器可以从命令行启动,不带参数,然后它将显示一个空窗口。用户将不得不通过“文件”菜单打开要编辑的文件。否则,要编辑的文件可以在命令行中指定,例如:

Edit.com C:\DOS\Addons.txt Part6.txt

要编辑的第一个文件的名称前面有路径;如果没有路径,EDIT.COM 编辑器只能打开位于当前目录中的文件。因此,第二个文件(Part6.txt),在没有路径的情况下指定,必须存在于当前目录中。默认情况下,这两个文件都将以文本方式打开,但只有第一个打开的文件将显示在编辑器的显示窗口中。用户可以选择通过 CTRL-F6 键击打开第二个窗口,或者通过 F8 键击切换初始窗口以编辑第二个打开的文件。

EDIT.COM 的一些预设和帮助文本存储在文件 EDIT.INI 和 EDIT.HLP 中(隐含地存在于同一个目录中),但 EDIT.COM 只能在没有帮助和仅使用默认设置的情况下应对。当 EDIT.INI 不存在时,用户仍然可以通过“选项”菜单保存可选的预设,这将导致 EDIT.COM 重新生成 EDIT.INI 文件。

EDIT.COM 保留了一些在 DOS 中处于活动状态的“热键”的功能。其中包括 BACKSPACE 键和 ALT 键与数字键盘中的数字组合,允许通过其 ASCII 码输入字符。但大多数其他“热键”功能都被重新定义。ALT 键激活上栏菜单中选择项目的文字“热键”,并且还在键盘的文字部分激活数字键,用于根据其编号选择打开的文件,如果打开了多个文件。箭头键可以在编辑器窗口的任何位置移动光标。如果在光标在文本的一部分上移动时按住 SHIFT 键,则该文本部分将被选中(突出显示)以进行删除或复制到剪贴板。当通过鼠标将光标拖动到文本的一部分上时,也会获得相同的效果,同时保持其左按钮按下。

除了提到的键功能外,EDIT.COM 还激活以下“热键”和键组合:

CTRL C 将选定的文本部分复制到剪贴板(CTRL-INS 键组合的作用类似);
CTRL F4 关闭活动窗口(如果两个窗口都已打开);
CTRL F6 将窗口分成两部分(如果只打开了一个窗口);
CTRL F8 调整两个窗口的大小(如果两个窗口都已打开);
CTRL Home 将光标移动到打开文件的开头;
CTRL End 将光标移动到打开文件的末尾;
CTRL P 允许插入 ASCII 码的非文字符号(在底行显示进一步的提示);
CTRL-PageDown 将窗口向右移动一行长度;
CTRL-PageUp 将窗口向左移动一行长度;
CTRL Q 访问查找/替换/删除功能(在底行显示进一步的提示);
CTRL-Space 删除选定的文本部分;
CTRL V 将剪贴板的内容粘贴到光标的位置;
CTRL W 向下滚动文本一行(键组合 CTRL-UpArrow 作用类似);
CTRL X 将选定的文本块剪切到剪贴板缓冲区;
CTRL Y 删除光标指向的行,即使该行未被选中;
CTRL Z 向上滚动文本一行(键组合 CTRL-DownArrow 作用类似);
Delete 删除光标位置的一个字符,如果未选择任何文本,否则删除选定的文本部分;
F3 查找之前通过 CTRL-Q-F 键组合指定的下一个项目;
F6 切换活动窗口和被动窗口(如果两个窗口都已打开);
F8 切换活动窗口以显示下一个文件(如果打开了多个文件);
PageUp 向上滚动显示的文本一页;
PageDown 向下滚动显示的文本一页。

上栏菜单中显示了一些“热键”组合。这些菜单和这些菜单中的单独项目不仅可以通过击键打开,还可以通过鼠标的左按钮打开。

由于二进制文件没有行结构,因此在命令行中指定换行将使它们的编辑更方便,例如:

Edit.com /78 Sc_sct.dat

其中

/78 一个选项,用于将行换行到 78 个字符宽。可以指定 78 到 255 之间的任何数字,但 78 对应于 80x25 屏幕显示模式下编辑器的实际窗口宽度。

EDIT.COM 还可以从命令行接受以下选项:

/B 将显示切换到单色;
/H 将显示切换到最大允许的屏幕行数;
/R 只读打开文件,排除更改的风险;
/S 强制使用短文件名;
/? 显示联机帮助。

6.10 EXPAND.EXE – 压缩文件解压缩器

[编辑 | 编辑源代码]

EXPAND.EXE 是用于解压缩使用 Microsoft 的 COMPRESS.COM 实用程序压缩的文件的解压缩器。每个这样的压缩文件只包含一个原始文件并继承其名称,除了后缀中的最后一个字符被替换为下划线,例如 *.TX_ 而不是 *.TXT。以前版本的 MS-DOS 和一些其他软件包包含此类压缩文件以及 EXPAND.EXE 解压缩器实用程序。特别是,EXPAND.EXE 存在于 SFX 存档 DOS62SP.EXE 中,可以从 Microsoft 的 FTP 服务器 ftp://ftp.microsoft.com/softlib/mslfiles/ 下载。

EXPAND.EXE 解压缩器实用程序的名称后面必须跟着要解压缩的压缩文件的名称,然后是应该分配给已还原原始文件的名称,例如:

Expand.exe E:\DOS\MSDOS622\Country.tx_ C:\DOS\MS6\Country.txt

显示的示例中的两个路径都是可选的。还原文件名称之前的路径被解释为将解压缩结果写入该目录的指令。如果省略路径,则只会搜索当前目录中的压缩文件,并将结果放置在该目录中,但在这种特定情况下是允许的,因为压缩文件和原始文件具有不同的名称。

EXPAND.EXE 不允许在文件名中使用通配符(2.01-03),但一个命令行中可以有多个压缩文件的名称。在这种情况下,最后一个指定的名称必须是目录名称(不带尾部反斜杠),解压缩的文件应写入该目录。此任务的当前目录名称不能省略,但可以用点(2.02-03)表示。

使用旧版本的 COMPRESS.COM 压缩的源文件不包含有关压缩文件原始名称的信息。这些文件将被正确解压缩,但如果在命令行中没有给出显式的新名称规范,则它们的原始名称将不会被恢复。因此,由于可能出现名称冲突,应避免将一个公共目录同时用作源目录和目标目录。

注意
  1. Windows-2000/XP 版本中的压缩文件也在后缀末尾用下划线标记,但这些文件是使用其他算法压缩的。它们在 MS-DOS 7 中的解压缩可以通过 EXTRACT.EXE(6.11)执行。

6.11 EXTRACT.EXE – *.CAB 文件解压缩器

[编辑 | 编辑源代码]

EXTRACT.EXE 实用程序解压缩由 MAKECAB.EXE 打包器压缩的文件。Microsoft 使用此算法压缩 Windows-2000/XP 版本中的单独文件,以及在 Windows-95/98/ME 版本中编译带有 *.CAB 后缀的大型多卷存档。EXTRACT.EXE 允许从大型 *.CAB 存档中提取单独的文件并显示其内容。以下是用于从多卷 *.CAB 存档中提取内容列表的命令行示例:

Extract.exe /A /D E:\Win95\OSR2.PE\Win95_21.cab > C:\Temp\List.txt

其中

E:\Win95\OSR2.PE\ – Windows-95 版本中一个 *.CAB 存档的路径示例。隐含地认为同一个存档的其他卷存在于同一个目录中。如果省略路径,则仅在当前目录中搜索存档。
/D 一个选项,规定在不解压缩存档卷的情况下显示内容表。
/A 一个选项,规定对同一个存档的所有后续卷应用相同的操作。在本例中,它会导致处理从第 22 卷到第 26 卷的 CAB 存档卷。

由于 *.CAB 存档包含大量文件,因此很难从滚动的屏幕上感知其长内容表。这就是为什么在显示的示例中,输出被重定向到文件 List.txt 中,可以使用查看器(6.19)或编辑器程序(6.09)更方便地分析该文件。

以下是从多卷存档中提取单个文件的另一个 EXTRACT.EXE 使用示例,当预先不知道哪个特定卷包含所需文件时:

Extract.exe /A /Y /L C:\Windows\System Win95_02.cab Msvcrt40.dll

其中

/Y 一个选项,指示覆盖目标目录中任何同名的文件,无需提示。
/L 一个选项,指示将后续项目 (C:\Windows\System) 解释为解压的目标路径。当省略 /L 参数时,解压的默认目标为当前目录。
Msvcrt40.dll – 要解压的文件的文件名示例(可能指定多个要解压的文件名)。

在所示示例中,第一个指定的文件名 (Win95_02.cab) 被解释为该存档卷的名称,从中开始搜索所需的文件。所有后续文件名都被解释为要提取和解压缩的文件的名称。执行所示命令行将启动从 02 到 26 的卷的搜索过程,以查找指定的文件。实际上,它将在第 13 个卷中找到并解压到 C:\WINDOWS\SYSTEM 目录,覆盖那里已损坏的相同文件的样本。此类过程比软件版本的完全解压快得多。

EXTRACT.EXE 不允许在文件名中使用通配符 (2.01-03),但接受一个可选参数 /E,该参数强制解压指定 CAB 文件的所有内容。在这种情况下,不应指定要解压的文件的特定名称。/E 参数适用于从 Windows-2000/XP 版本中解压非柜式压缩文件(那些在后缀末尾带有下划线的文件)。但在 DOS 中完全解压大型 *.CAB 文件需要花费太多时间。/A 和 /E 参数的组合需要特别注意,因为它可能会启动一个过程,该过程将花费数小时的时间和大量的磁盘空间。

注意
  1. 一些软件供应商提供的 *.CAB 存档是由其他压缩算法生成的。除此之外,还知道几个相互不兼容的 EXTRACT.EXE 版本。对于任何给定的软件版本,最合适的解压程序是该版本中提供的那个。

6.12 FC.EXE – 文件比较实用程序

[编辑 | 编辑源代码]

FC.EXE 实用程序可以比较两个文件,无论是二进制文件还是文本文件。二进制比较适用于查找几乎相同的二进制文件中已更改的字节:FC.EXE 显示每对不匹配字节的字节号以及这些字节本身,分别取自每个比较文件。以下是在执行二进制比较的命令行示例

Fc.exe /B Trial2.com D:\Temp\Trial1.com

其中

/B 一个选项,指示二进制比较。
Trial2.com – 要比较的第一个文件的示例;由于其名称前面没有路径,因此隐含地存在于当前目录中。
D:\Temp\Trial1.com – 带有前导路径的第二个文件的名称示例。

二进制比较并不意味着在字节的相互偏移序列中搜索匹配。

文本比较基于文本文件的行结构。FC.EXE 逐行比较文本文件并并排显示不匹配的行。当行序列之间的对应顺序被打乱时,FC.EXE 可以通过搜索下一组匹配的行来恢复它。比较和搜索条件均由命令行中的选项指定,例如

Fc.exe /A /C /L /LB9 /N /T /W /1 A:\Config.sys C:\Config.sys

其中

/A 仅显示每组不匹配行中的 2 行(第一行和最后一行)。
/C 忽略字母的大小写(对于 ASCII 代码高达 127)。
/L ASCII 文本比较的规定。
/LB9 匹配搜索区域的限制示例(9 个连续的不匹配行);默认为 100 行。
/N 指示显示行号的规定。
/T 指示避免将制表符代码 (09h) 扩展为空格的规定。
/W 指示忽略空格(制表符代码和空格)的规定。
/1 一组不匹配行后必须匹配的连续行的数字示例。
注意

对于具有 BIN、COM、EXE、LIB、OBJ、SYS 后缀的文件,二进制比较是默认值。其他文件默认为文本比较。

  1. 在特殊应用程序中,要比较的文件之一(或两者)可以用其他来源 (2.01-01) 替换,例如,虚拟设备 NUL 或 CON 设备 – 控制台。后者可以执行与键盘输入的比较 (1.04)。

6.13 FDISK.EXE – HDD 分区工具

[编辑 | 编辑源代码]

磁盘,以其字母名称识别,是逻辑磁盘。与之相反,物理硬盘存储设备没有字母名称。物理存储设备中的可写存储空间可以划分为多个分区,每个分区可以表示一个单独的逻辑磁盘。FDISK.EXE 实用程序是专有的 MS-DOS 7 的工具,用于安排物理 HDD(硬盘驱动器)中的分区结构。

在没有参数的情况下启动时,FDISK.EXE 会询问用户是否应提供大磁盘支持。拒绝此提议意味着 512–2048 Mb 范围内的分区将为 FAT-16 类型,否则将首选 FAT-32 类型。对于超出上述范围的分区,默认分配 FAT 系统:对于大于 2048 Mb 的分区为 FAT-32,对于 512 到 16 Mb 之间的分区为 FAT-16,对于 16 Mb 及更小的卷为 FAT-12。

那些倾向于信任自己的人可以指定命令行参数,从而摆脱不必要的疑问和限制

Fdisk.exe /fprmt /actok

/fprmt 参数取消有关大磁盘支持的查询,并将文件系统选择的所有权限赋予用户。/actok 参数可以安排任何物理硬盘驱动器中的活动分区(否则只能在第一个物理 HDD 中安排活动分区)。以所示方式启动时,FDISK.EXE 将显示一个菜单以选择操作:显示当前分区结构、删除或创建分区或将其设为活动状态。用户可以创建分区结构,但后者不会立即写入磁盘。FDISK.EXE 提供机会更正它。如果分区应该可引导,请不要忘记将其设为活动状态。然后您可以退出 FDISK.EXE。

如果分区结构已更改,FDISK.EXE 会将其写入磁盘并退出到重新启动,因为创建的分区必须由 BIOS 注册。PC 的 BIOS 系统将字母名称分配给注册的分区。从那时起,所有注册的分区都成为 DOS 中可见的逻辑磁盘,但新的逻辑磁盘尚未格式化,因此无法访问。新的逻辑磁盘在通过 FORMAT.COM 实用程序 (6.15) 格式化后变得可访问。

除了交互式安排分区结构之外,FDISK.EXE 还可以用作具有以下选项的普通控制台实用程序

Fdisk.exe /? 显示简短帮助。
Fdisk.exe /status 显示可用的物理 HDD 和逻辑磁盘的分配。
Fdisk.exe /mbr 在第一个 HDD 上写入或重写 MBR(主引导记录),同时保持其分区表不变。[注释 1] 不显示确认消息。
Fdisk.exe /cmbr 2 作用与 /mbr 相同,但允许通过物理编号指定目标 HDD:如果这些 HDD 存在,则允许 1、2、3 及以上。不显示确认消息。

无论 FDISK.EXE 使用的目的如何,其命令行都可以补充 /X 选项,该选项强制避免扩展磁盘访问的支持功能。当普通使用尝试失败时,应记住 /X 选项:HDD 未被识别、被发现无法访问或 PC 出现“堆栈溢出”消息而挂起。这些结果可能是由于配置错误、硬件故障或病毒 MBR 感染造成的。不一定,但在某些此类情况下,/X 选项可能会有所帮助。

如果应该在几个新的 HDD 上形成相同的分区结构,那么应该首选自动(非交互式)安排分区。可以通过以下命令行示例初始化将分区结构自动写入 HDD

Fdisk.exe 1 /PRI:2000 /EXT:8000 /LOG:8000 /Q

其中

1 目标物理 HDD 编号 (1、2、…)。
/PRI:2000 – 安排主分区,例如 2000 Mb。如果应在此分区中形成 FAT-16 文件系统,则应指定 /PRIO: 参数(而不是 /PRI:)。
/EXT:8000 – 安排扩展分区,例如 8000 Mb。
/LOG:8000 – 在扩展分区内安排逻辑磁盘,例如 8000 Mb。对于不超过 2000 Mb 的大小,参数 /LOGO:(而不是 /LOG:)表示应形成 FAT-16 文件系统。
/Q “静默”选项,即在没有屏幕消息的情况下运行。

成功完成其工作后,FDISK.EXE 将初始化重新启动。

注意
  1. ^ 重写 MBR 可以消除 MBR 错误,包括病毒造成的错误。但是,某些 BIOS 扩展和引导管理器使用非标准类型的 MBR,FDISK.EXE 无法恢复这些 MBR。在这种情况下,应首选其他 MBR 恢复方法(例如,在 9.02-03 中)。
  2. Microsoft 的 FDISK.EXE 不支持分区的非顺序放置,因此无法绕过物理磁盘表面磨损的区域。FDISK.EXE 无法正确安排那些跨越物理磁盘空间 8.4 Gb 边界的分区。FDISK.EXE 经常无法正确处理由其他操作系统安排的分区:要么无法删除此类分区,要么可能会安排新的分区,覆盖以前的分区。
  3. 原始 Microsoft FDISK.EXE 最重要的缺点已在其新的非官方版本(2006 年发布)中得到纠正,该版本可以从网站 http://radified.com/Files/FDISK.EXE 下载。除此之外,Brian E. Reifsnyder 还编译了完全新的同名实用程序。此实用程序的 1.30 版本(2003 年发布),打包在 fdisk130.zip 存档中,可以从服务器 ftp://ftp.uni-koeln.de/pc/msdos/diskutils/ 下载
  4. FDISK.EXE 执行的任何现有分区结构更改都会导致受影响分区中的所有数据丢失。可以使用更强大的工具(例如 PowerQuest 的 Partition Magic 实用程序(现已由 Symantec Co. 收购))来执行不丢失数据的分区重新排列。
  5. FDISK.EXE 无法安排通过网络访问或由驱动程序控制的 HDD 中的分区。由于后一个原因,FDISK.EXE 通常无法处理具有 SCSI 或 USB 接口的外部存储设备。在这种情况下,其他实用程序可能适用,例如 BTFDISK.EXE(来自 Buslogic)或 TFDISK.EXE(来自 TEKRAM)。包含 TFDISK.EXE 的存档 DC390FBW.ZIP 可以在互联网网站 http://www.neuron.alt.ru/drivers/Driver/Controllers/ 的 TEKRAM 子目录中找到。包含 BTFDISK.EXE 的 SFX 存档 DOSASPI.EXE 位于同一网站的 BUSLOGIC 子目录中。

6.14 FIND.EXE – 单词(s)搜索过滤器

[编辑 | 编辑源代码]

FIND.EXE 实用程序充当文本数据的过滤器:它从文件或通过重定向接收文本行,选择包含或不包含特定字符组合的行,并将选定的行发送到标准输出通道 (STDOUT),默认情况下在屏幕上显示。以下是用单词(串)过滤器搜索包含指定字符字符串的行的一个示例

Find /N /I " INT 13 " C:\DOS\SRV\Drives.txt

其中

/N 一个选项,规定在显示的行后面附上它们的行号。
/I 一个选项,规定忽略指定字符字符串中字母的大小写。
" INT 13 " – 要搜索的字符字符串示例,用双引号括起来。请注意单词之间的空格以及每个相邻的双引号 - 这保证了查找整个单词,而不是其他单词的一部分。
C:\DOS\SRV\Drives.txt – 要分析的文件示例(带前导路径)。如果未指定路径,则表示该文件存在于当前目录中。一行中可以逐个或通过通配符指定多个文件名 (2.01-03)。

显示的命令行示例将在屏幕上显示分析文件的所有行,这些行包含单词 INT 13,以及一条简短的消息,提醒已分析了哪个文件。行将以它们的编号开头显示:这将帮助您在以后编辑同一文件时找到它们。如果您预计显示的列表可能过长,您可以将输出发送到文件 (2.04-03) 或发送到查看器 MORE.COM (6.19)。

FIND.EXE 完成搜索后,如果至少找到一次指定的字符字符串,则返回错误级别 0,否则如果在分析的文本中未找到该字符串,则返回错误级别 1。可以使用错误级别来确定搜索结果(请参阅文章 3.15-03 和 6.03)。

下一个不太典型的示例显示了 FIND.EXE 如何计算文本文件中的行数

Find.exe /V /C "" < Draft.txt

其中

/V 一个选项,规定显示所有不包含指定字符串的行。
/C 一个选项,规定仅显示满足指定条件的行数。
"" 要搜索的字符串的空规范。
< Draft.txt – 要分析的文件示例,通过输入重定向 (2.04-02) 发送。由于文件名前面没有路径,因此表示该文件存在于当前目录中。通过重定向获取输入后,FIND.EXE 不会将其提醒消息添加到显示结果中。

FIND.EXE 将要搜索的空字符串视为一个特殊的非现有对象。因此,FIND.EXE 将简单地计算所有行,包括空行。计算行数后,FIND.EXE 始终返回错误级别 0。

第三个用法示例显示了批处理文件中的行。假设目标路径作为环境变量 %P% 的值给出,并且不知道它是否具有尾随反斜杠。由于 DOS 对尾随反斜杠的存在与否并不无所谓,因此如果尚未指定,则需要追加它。这可以通过以下方式完成

echo %P%\\ | Find.exe "\\\" > nul
if errorlevel 1 set P=%P%\

在第一行中,FIND.EXE 分析 ECHO 命令的重定向输出,并尝试查找指定的符号组合,如果给定的路径包含尾随反斜杠,则该组合将存在于其中。FIND.EXE 的 STDOUT 输出没有意义,并发送到 NUL(无处)。结果通过 FIND.EXE 遗留的错误级别值得知。它在所示示例的第二行中进行了分析。错误级别 1 表示 FIND.EXE 在给定的路径中没有找到尾随反斜杠,然后 SET 命令 (3.26) 将追加丢失的反斜杠。

最后一个(第四个)用法示例也是批处理文件的一部分。假设您已激活了一个过程,该过程准备了一个要打包到存档中的文件列表(%Temp%\Files.lst),并且希望防止重复打包,当此列表除了同类存档(例如 RAR)之外不包含任何其他内容时。这可以通过以下命令行实现

Find /C /I /V ".rar" < %Temp%\Files.lst | Find ": 0" > nul
if not errorlevel 1 echo Chosen file(s) – already RAR-archive(s)
if not errorlevel 1 goto NO_PACK

在第一行中,FIND.EXE 的最左侧调用通过输入重定向逐行从列表中读取文件名,并且仅计算那些不包含以“.RAR”为后缀的文件名的行。计数结果通过 STDOUT 重定向到 FIND.EXE 的第二个(最右侧)调用,该调用正在“等待”零计数。当计数结果确实为零(即除了 RAR 存档之外没有其他文件)时,FIND.EXE 的最右侧调用会留下错误级别 0。此错误级别值在示例的第二行和第三行中进行检查。第二行显示错误消息,第三行执行跳转到标签“NO_PACK”,从而能够绕过打包操作。

6.15 FORMAT.COM – 磁盘格式化工具

[编辑 | 编辑源代码]

FORMAT.COM 实用程序在存储介质上组织逻辑磁盘,包括磁盘和硬盘分区。格式化包括测试每个扇区的可读性、写入扇区标头、创建引导扇区、文件分配表 (FAT) 和根目录。发现有不可读扇区的簇在 FAT 中被标记为“坏”,因此不再使用。16 Mb 及以下的磁盘使用 FAT-12 文件系统进行格式化。硬盘分区的 FAT 类型(FAT-16 或 FAT-32)的选择取决于 FAT 类型标识符 (A.13-6),该标识符之前由 FDISK.EXE (6.13) 分配给特定分区。簇大小会自动计算为给定磁盘大小和 FAT 类型的允许最小值。

软盘(磁盘)的格式化意味着磁道的低级重新校准,因此磁盘的实际容量可能会发生变化。格式化磁盘的命令行示例可能如下所示

Format.com A: /V:Archives /Q /F:1.44 /B

其中

A 要格式化的磁盘的必需字母名称规范。有效的字母名称是在启动时分配给磁盘的,当时磁盘由 BIOS 注册。稍后通过软件方式分配或更改的那些字母名称被 FORMAT.COM 视为无效。
/V:Archives – 卷标的可选规范示例:最多 11 个字符的任意单词。如果省略此选项,FORMAT.COM 会在格式化过程的最后阶段提示您指定卷标。用户可以拒绝此提议并按 ENTER 键;然后此逻辑磁盘将被赋予 NO_NAME 标签。
/Q “快速格式化” – 一个选项,规定跳过大多数耗时的操作:扇区测试和标头写入。使用“Q”选项进行格式化用于删除那些已格式化并且扇区标头和扇区本身状况良好的磁盘的所有内容。如果对此有任何疑问,则不建议进行快速格式化。
/F:1.44 可选大小规范(仅限软盘)。允许的大小为:160、180、320、360、720(kb)和 1.2、1.44、2.88(Mb)。您可以使用其他形式的大小规范代替/F 选项,如下所示注释 1。当未指定任何允许的大小选项时,FORMAT.COM 能够根据 BIOS 的 CMOS 设置和驱动器的传感器信号确定合适的大小。
/B 一个选项,规定保留系统文件空间以便稍后使磁盘可引导。您可以使用 /S 代替 /B,这意味着相同的功能以及将 DOS 的系统文件复制到格式化磁盘的根目录中。系统文件 (COMMAND.COM、IO.SYS) 隐含存在于 PC 主引导磁盘的根目录中。与其他系统文件相反,MSDOS.SYS 不会被复制:FORMAT.COM 会重新创建一个此文件的空示例。

现代硬盘驱动器具有固定的磁道结构。格式化过程无法更改它。因此,不应为格式化 HDD 分区指定磁盘大小、扇区数和其他类似的格式参数,例如

Format.com D: /s /c /z:64

其中

/c 一个选项,规定测试当前标记为“坏”的簇。有时这可以恢复那些在第一个磁道中标记了“坏”扇区的磁盘和磁盘。但是,测试大量坏簇可能会大大增加格式化所需的时间。
/z:64 一个选项,强制安排 32 kb 簇,每个簇包含 64 个扇区。如果您打算稍后扩展此分区,则可能需要这样做。/z:1 选项可以在小型磁盘(4 到 16 Mb)上安排 FAT-16 文件系统。但是,大多数情况下省略“/z:”规范,因为默认簇大小被认为是最佳的。
注意
  1. 您可以指定每磁道磁道的数量和扇区的数量,而不是软盘的总大小,例如 /T:80 /N:18/F 的另一个替代方法是使用以下方法
    /1 – 格式化过时的单面磁盘;
    /4 – 在 1.2 Mb 5.25 英寸驱动器中格式化 360 kb 软盘;
    /8 – 每磁道格式化 8 个扇区。
  2. 来自 Microsoft 的原始 FORMAT.COM(1998 年发布)无法正确处理 64 Gb 以上分区的格式化。已更正版本(2006 年发布),打包到 SFX 存档 FDSKFRMT.EXE 中,可以从http://www.mdgx.com/files/FDSKFRMT.EXE 下载。

6.16 LABEL.EXE – 卷标更改工具

[编辑 | 编辑源代码]

卷标是一个最多11个字符的单词或词组,用作存储介质的标识符。卷标写入引导扇区(A.03-4),此外还写入根目录的一个隐藏条目。大多数情况下,卷标是在格式化过程中指定的,但也可以通过例如 LABEL.EXE 实用程序稍后分配或更改。

Label.exe R:RAMDRIVE

其中

R 一个磁盘规格示例,该磁盘应更改其卷标;如果未指定磁盘,则默认情况下使用当前磁盘。
RAMDRIVE – 要分配给指定磁盘的卷标示例。

如果省略卷标,LABEL.EXE 将显示指定磁盘的当前卷标并提供输入新卷标的选项。新卷标规范也可以通过重定向来接受(2.04-02,2.04-05)。如果用户拒绝该选项,则会提示用户删除(或保留)当前卷标。

LABEL.EXE 实用程序完成其工作后,将留下以下错误级别值

082 – 卷标写入尝试失败。
015 – 无效的盘符名称,没有相应的驱动器。
002 – 驱动器内部没有可移动存储介质。
000 – 磁盘可访问或未格式化。无论如何,都没有尝试写入卷标。

返回的错误级别值可以像文章 3.15-03 和 6.03 中所示的那样确定。由于返回的错误级别值具有信息性,因此 LABEL.EXE 实用程序有时用于测试磁盘的可访问性(文章 9.03-02 中的示例)。

6.17 MEM.EXE – 内存分配浏览器

[编辑 | 编辑源代码]

调用 MEM.EXE 实用程序以显示有关可用内存量、内存分配、已加载的驻留模块的信息,例如

Mem.exe /A /C /P

其中选项为

/A 附加有关 HMA 区域中可用空间的数据的摘要。
/C 显示内存使用情况的摘要表。此表的第一列列出驻留模块的名称,其余列列出内存分配的详细信息。代替/C选项,可以指定
/D – 显示驻留模块和驱动程序的状态;
/F – 仅显示可用内存量;
/M:HIMEM – 显示有关特定驻留模块(本例中为 HIMEM)的详细信息。其名称在/M选项后指定,必须用冒号分隔。模块名称应取自摘要表的第一列。
/P 在每屏信息之后暂停。

6.18 MODE.COM – 外设接口调整器

[编辑 | 编辑源代码]

MODE.COM 实用程序为端口、视频卡和字符生成器实现了许多接口配置功能。当 MODE.COM 实用程序使用/STATUS选项调用时,它将显示当前从属设备设置的摘要表。

Mode.com /STATUS

6.18-01 MODE.COM:端口调整操作

[编辑 | 编辑源代码]

MODE.COM 对串行端口(COM1、COM2、COM3、COM4)执行接口调整操作,如下例所示:

Mode.com COM1:11,E,8,2,B

其中

11 设置波特率为 110;允许的值为 11、15、30、60、12、24、48、96、19,分别对应于波特率 110、150、300、600、1200、2400、4800、9600 和 19200。
E 实现偶校验;您可以指定
O 实现奇校验;
N 无校验。
8 设置每个码字 8 个信息位(允许 8 或 7)。
2 设置停止位数(允许 1 或 2)。
B 表示对端口错误的正常反应。代替B,可以指定
E 如果连接的设备繁忙,则返回 ERROR 消息;
N 错误发生后,不要重复呼叫端口;
P 重复呼叫端口,直到按下 CTRL-BREAK 键;
R 即使连接的设备未完成其先前的工作,也强制切换到新工作。

并行端口(LPT1、LPT2、LPT3)的接口调整操作意味着连接的设备是打印机。因此,对于并行端口,MODE.COM 实用程序接受其他参数,例如

Mode.com LPT1:80,6,B

其中

80 每行字符数(允许 80 或 132);
6 每英寸行数(允许 6 或 8),
B 表示对打印机错误的正常反应。代替B,可以指定与上一个示例中串行端口相同的选项。

MODE.COM 实用程序可以将来自并行端口(LPT1LPT3)的消息重新寻址到任何串行端口(COM1COM4),从而能够使用具有串行接口的打印机。

Mode LPT1:=COM2

为了取消重新寻址,应在相同并行端口名称后再次调用 MODE.COM 实用程序,而无需其他规范。

Mode.com LPT1:

6.18-02 MODE.COM:文本视频模式切换

[编辑 | 编辑源代码]

MODE.COM 实用程序允许两种形式的命令来切换文本视频模式(A.10-1)。以下是一个最旧的命令形式的示例:

Mode.com co80

其中

co80 表示每行 80 个字符的彩色视频模式。代替co80,可以指定
bw40 单色视频模式,每行 40 个字符;
bw80 单色视频模式,每行 80 个字符;
co40 彩色视频模式,每行 40 个字符。

切换文本视频模式的第二种命令形式如下所示:

Mode.com 80,25

其中

80 每行字符数(允许 40 或 80);
25 每屏高度的行数(允许 25、43 或 50)。
注意
  1. 切换文本视频模式会伴随着重新加载字体。如果当前字体由其他程序(除 MODE.COM 外)安装,则 MODE.COM 更改视频模式可能会导致从国家字体返回到默认的美国字体代码页 437。

6.18-03 MODE.COM:代码页选择

[编辑 | 编辑源代码]

MODE.COM 实用程序执行的代码页准备和选择操作命令通常写入 AUTOEXEC.BAT 文件(9.01-02)。所有这些操作都需要加载 DISPLAY.SYS 驱动程序(5.02-02)。这些操作中的第一个是为进一步激活准备多个代码页。

Mode.com CON CP PREP=((437,850,866) EGA3.CPI)

其中

CON 是此操作所针对的设备的规范。代替CON(控制台,即键盘和显示器),可以指定端口LPT1LPT2PRN(打印机)。
CP PREP “代码页准备”操作的缩写名称。
(437,850,866) – 要准备的代码页编号(A.02-2)。只有这些代码页可通过 CHCP 命令(3.04)进行切换。
EGA3.CPI 包含所有应准备的代码页的文件名的示例。

然后,应通过选择操作激活准备好的代码页之一。

Mode.com CON CP SEL=866

其中

CP SEL “代码页选择”操作的缩写名称。
866 要激活的代码页编号示例。

为 CON(控制台)设备激活的代码页定义屏幕上字母和符号的视觉表示。为了确定当前为特定输出设备激活了哪个代码页,您应使用设备规范(CONPRNLPT1LPT2)、CP(代码页)操作名称和/STATUS选项调用 MODE.COM 实用程序。

Mode.com CON CP /STATUS

任何加载的代码页都可能因故障或其他软件的不当操作而损坏。在这种情况下,MODE.COM 实用程序允许使用以下命令重新加载活动代码页:

Mode.com CON CP REF

其中

CP REF “代码页刷新”操作的缩写名称。

6.19 MORE.COM – 分页查看器

[编辑 | 编辑源代码]

当长消息作为整体发送到显示器时,文本在屏幕上滚动得太快而无法感知。为了使长消息可读,MORE.COM 查看器以分页方式将它们发送到显示器。每次屏幕充满文本时,MORE.COM 查看器都会暂停输出,以便用户阅读文本。用户的每次击键都会启动下一文本页的显示。

MORE.COM 查看器通过输入重定向(2.04-02)拦截发送到标准输出通道(STDOUT)的消息。

More.com < D:\MyDocs\Part2.txt

或通过中间重定向(2.04-05)。

Type D:\MyDocs\Part2.txt | More.com

其中

D:\MyDocs\Part2.txt – 是要显示的文件名的示例,前面是完整路径。如果省略路径,则表示该文件存在于当前目录中。
Type D:\MyDocs\Part2.txt – 是发送其输出通过 STDOUT 输出通道的命令(3.30)的示例。可以指定任何其他将输出发送到 STDOUT 的命令。
注意
  1. 通过 BIOS 中断或通过 STDERR 输出通道发送到显示器的消息无法被 MORE.COM 拦截。
  2. 当 MORE.COM 查看器通过中间重定向(2.04-05)接受消息时,该消息将写入临时文件,并且需要访问可写介质。如果当前磁盘不可写或写保护,并且环境变量 %TEMP% 中未定义可写介质的路径,则 MORE.COM 查看器无法执行此任务。因此,应优先选择通过输入重定向进行拦截。

6.20 MOVE.EXE – 复制和重命名实用程序

[编辑 | 编辑源代码]

MOVE.EXE 实用程序用于重命名目录并将文件从一个目录移动到另一个目录。

当源目录和目标目录属于不同的逻辑磁盘时,移动等同于复制,然后删除源目录中复制的文件。但当源目录和目标目录都属于同一逻辑磁盘时,可以通过重新排列目录条目来更快地执行移动:文件第一个簇的引用记录从一个目录表移动到另一个目录表,而无需触及文件本身。MOVE.EXE 实用程序能够确定在每种特定情况下应采用哪种移动方式。

文件移动可以伴随着重命名。目录的重命名也是通过更正父目录表中的条目来执行的。

以下是一个 MOVE.EXE 用法示例,用于将文件从一个目录移动到另一个目录

Move.exe /Y D:\MyDocs\Part*.txt C:\Dos\Chap*.txt

其中

/Y 一个选项,用于在不提示的情况下覆盖目标目录中的同名文件。当命令行中不存在此选项时,MOVE.EXE 会尝试在 COPYCMD 环境变量的值中查找它。如果 COPYCMD 值包含此选项,则可以通过在命令行中指定相反的 /-Y 选项来克服它的作用。
D:\MyDocs\Part*.txt – 带有前导路径的源文件规范示例。如果文件位于当前目录中,则可以省略路径。一个命令行中可以有多个源规范。
C:\Dos\Chap*.txt – 目标规范示例,包括用于将要移动的文件重命名的掩码。命令行中所有此类规范中的最后一个被解释为目标目录规范。如果此规范中的最后一个名称不是现有对象的名称,则将此新名称分配给移动的文件。但当目标规范中的最后一个名称是现有目录的名称时,文件将移动到该目录中,而不会重命名。

为了重命名目录,源规范中的最后一个名称不能是掩码或文件名,而必须是现有目录的名称。在这种情况下,目标规范必须仅包含新名称,而无需路径,即使要重命名的目录不是当前目录中的子目录。

6.21 SCANDISK.EXE – 磁盘修复工具

[编辑 | 编辑源代码]

SCANDISK.EXE 是一个用于检查和修复软盘和硬盘驱动器的程序,这些驱动器使用 FAT12、FAT16 或 FAT32 文件系统格式化。SCANDISK.EXE 检查引导扇区,发现丢失的簇,更正 FAT 表中的交叉链接,检查每个簇中磁盘表面的可写性。不可读的簇在 FAT 中标记为 BAD,因此不再使用。测试过程和坏簇的位置显示在图表中,如下面的图 4 所示。

图 4

SCANDISK.EXE 尝试将坏簇中的信息重写到好的簇中,以恢复每个文件的完整性。定期启动 SCANDISK 的维护程序可以使您的计算机长时间保持良好的运行状态。

测试结构的详细信息由存储在单独文件 SCANDISK.INI 中的参数定义,该文件必须与主 SCANDISK.EXE 文件位于同一目录中。SCANDISK.INI 是一个文本文件。它包含全面的注释,并且可以由用户编辑。如果您必须根据 SCANDISK.INI 中的所有参数检查和修复驱动器,则必须在命令行中使用 /CUSTOM 选项启动 SCANDISK.EXE。如果未指定 /CUSTOM 选项,则只会考虑 SCANDISK.INI 文件的 [ENVIRONMENT] 部分中的参数。

命令行中的参数优先于 SCANDISK.INI 文件中指定的参数。SCANDISK.EXE 能够自动修复它发现的大部分错误,但为此它必须在命令行中使用参数启动,例如

Scandisk.exe C: /AUTOFIX /NOSAVE /NOSUMMARY /SURFACE

其中

C 要检查的磁盘的规范示例。如果您希望处理所有可访问的磁盘,则应指定 /ALL 而不是特定的盘符名称。压缩磁盘应使用其卷名指定,例如:C:\DRVSPACE.000
/AUTOFIX 在不提示的情况下修复错误。相反,当不需要自动修复时,可以指定 /CHECKONLY 选项而不是 /AUTOFIX
/NOSAVE 删除丢失的簇,而不是将其另存为文件。此选项仅在也指定了 /AUTOFIX 选项时才能使用。默认情况下,丢失的簇会被转换为同一磁盘根目录下的 *.CHK 文件。
/NOSUMMARY – 不要在摘要屏幕处停止。此选项可以与 /CHECKONLY/AUTOFIX 选项一起使用。
/SURFACE 在其他检查后执行表面扫描(表面扫描不应应用于压缩磁盘)。

如果未指定 /AUTOFIX 选项,则在进行任何更改之前,SCANDISK.EXE 会提示您将磁盘的当前状态写入 UNDO 磁盘。这提供了以后恢复当前磁盘状态的机会,如果修复导致出现错误。在做出有关 UNDO 磁盘的决定时,应考虑到当前状态记录中的数据量可能非常大。现代硬盘的大分区可能需要数百张 UNDO 磁盘和大量时间。因此,SCANDISK 关于 UNDO 磁盘的提示很可能应该被拒绝。

如果仍然在 UNDO 磁盘中保存了原始磁盘的状态,并且发现需要恢复此状态,则必须立即执行恢复过程,然后再将任何新文件写入此磁盘

Scandisk.exe /UNDO B:

其中

/UNDO 启动恢复过程的参数。
B 将用于读取 UNDO 磁盘的驱动器的规范示例。

SCANDISK.EXE 执行的另一个操作是探测特定文件是否已碎片化

Scandisk.exe /FRAGMENT C:\WINDOWS\SYSTEM\Kernel32.dll

其中

/FRAGMENT – 用于诱导文件碎片化探测的选项。
C:\WINDOWS\SYSTEM\KERNEL32.DLL – 要探测的文件的规范示例。如果省略路径,则只会在此文件的当前目录中搜索。

无论执行何种操作,SCANDISK.EXE 都从命令行接受另一个选项 – /MONO 选项,该选项用于将输出配置为单色显示(默认情况下,输出消息以彩色显示)。

注意
  1. SCANDISK 的过程不能应用于网络驱动器、CD/DVD-ROM、RAM 磁盘以及由 ASSIGN.COM、JOIN.EXE 和 SUBST.EXE 实用程序创建的虚拟磁盘。SCANDISK.EXE 也无法处理导致磁盘数据无法访问的损坏。但是,引导扇区损坏的无法访问的磁盘有时可以使用 Symantec Co. 的 NDD.EXE 或 DISKEDIT.EXE 实用程序恢复。
  2. SCANDISK.EXE 需要直接访问处理的磁盘,因此不能在多任务环境中使用。在 WINDOWS 操作系统安排的 DOS “窗口”中调用 SCANDISK.EXE,实际上会调用另一个程序 – \WINDOWS 目录中的 SCANDSKW.EXE。
  3. /AUTOFIX 选项的 SCANDISK.EXE 不应应用于怀疑感染了病毒的磁盘。这可能导致无法挽回的数据丢失。此类磁盘应首先由防病毒扫描程序处理(例如,由 DRWEB.EXE 处理)。
  4. 默认情况下,SCANDISK.EXE 将 Windows 操作系统指定的每个长文件名视为错误。尝试修复所有此类错误可能会产生可怕的后果。如果 SCANDISK.INI 文件的 [ENVIRONMENT] 部分包含以下行,则 SCANDISK.EXE 不会损坏长文件名
    LfnCheck = Off
    SpaceCheck = Off
    
    Windows ME 的 SCANDISK.EXE 改进版本对长文件名更宽容,可以在 MS-DOS 7 下使用。
  5. 除非同一磁盘上有一些空闲簇,否则无法执行将坏簇中的数据重写到好簇中的操作。当然,您可以删除任何文件以获得一些空闲空间,但有一些实用程序(例如,PKZIP.EXE 归档程序的 2.50 版本)会用单个文件填充软盘,不留任何空闲空间。由于一个损坏的扇区,这样的文件既无法读取也无法修复,因为没有备用扇区。应避免用一个文件填充整个介质。

6.22 SORT.EXE – 行排序过滤器

[编辑 | 编辑源代码]

SORT.EXE 实用程序从文件或通过重定向接受文本行,并以另一种排序顺序(通过 STDOUT 通道)发送到屏幕(默认)、另一个文件或设备。排序由 ASCII 代码表中字符的顺序定义。

以下示例显示了 SORT.EXE 用法,用于在屏幕上显示文本行的更改顺序

Sort.exe /R /+12 D:\MyDocs\Unsort.txt

其中

/R 一个选项,用于反转排序顺序,即从 Z 到 A,然后从 9 到 0。
/+12 根据第 12 列中的字符对行进行排序的规范示例。如果省略此选项,则默认情况下将使用第 1 列中的字符。
D:\MyDocs\Unsort.txt – 要处理的文件的规范示例(带前导路径)。没有前导路径的文件将只在当前目录中搜索。

第二个用法示例显示了通过重定向从源文件输入,以及重定向到另一个(目标)文件的输出

Sort.exe /+9 < D:\MyDocs\Unsort.txt > D:\MyDocs\Sort.txt

其中

D:\MyDocs\Sort.txt – 目标文件的规范示例。如果此文件存在,它将被覆盖,不会提示。不允许对源和目标都指定相同的文件(数据将丢失!)。

最后一个示例显示了通过另一个命令的中间重定向输入,以及将排序后的行输出到打印机

Type D:\MyDocs\Unsort.txt | Sort /+3 > PRN
注意
  1. 除非您确定打印机已正确连接到 LPT1 端口、已打开并且能够与 MS-DOS 协作,否则不应尝试重定向到打印机。
  2. 输出重定向(>)和通过“管道”(|)重定向都需要访问可写介质,并且如果未满足此条件则无法执行(2.04-03 – 2.04-05)。

6.23 SUBST.EXE – 虚拟磁盘的安排

[编辑 | 编辑源代码]

SUBST.EXE 实用程序用于安排虚拟磁盘,作为真实路径的等效替换。最初,SUBST.EXE 被开发为一种让旧程序(DOS 3.0 之前的版本)访问子目录的方法。早期的 DOS 版本“不知道”分层目录结构,所有文件都存储在单个根目录中。SUBST.EXE 实用程序允许像访问磁盘根目录一样访问任何子目录中的文件。如今,SUBST.EXE 实用程序很少使用,目的是为了将更多数据压缩到较短的命令行和环境变量 %PATH% 中。

以下是使用 SUBST.EXE 安排虚拟磁盘的示例:

Subst.exe V: D:\DATA386\For_K\MyDocs

其中

V 虚拟磁盘要安排的盘符名称示例。盘符名称必须是空闲的(不属于任何真实驱动器),并且必须在 CONFIG.SYS 文件中 LASTDRIVE 命令(4.17、4.18)设置的限制范围内选择。
D:\DATA386\For_K\MyDocs – 要分配给虚拟磁盘的真实磁盘和路径的示例。如果未指定路径,则隐含当前磁盘和路径。

为了删除虚拟磁盘,带有 SUBST.EXE 实用程序调用的命令行可能如下所示:

Subst V: /D

其中

V 要删除的虚拟磁盘的盘符名称示例。
/D 一个选项,指示删除虚拟磁盘。

在没有参数的情况下执行时,SUBST.EXE 实用程序会显示当前活动虚拟磁盘的列表。

注意
  1. 由 SUBST.EXE 安排的虚拟磁盘不能被以下实用程序操作:Assign.com、Backup.exe、Chkdsk.exe、Defrag.exe、Diskcomp.com、Diskcopy.com、Fdisk.exe、Format.com、Label.exe、Mirror.exe、Recover.exe、Restore.exe、Scandisk.exe、Sys.com、Undelete.exe、Unformat.com。
  2. 分配给虚拟磁盘的路径仍然可以通过常规方式访问。
  3. Windows 操作系统可以接受虚拟磁盘,但不能在 Windows 操作系统加载后安排。如有必要,应在加载 WINDOWS 之前安排虚拟磁盘,最好通过从 AUTOEXEC.BAT 文件的行启动 SUBST.EXE 实用程序来安排。

6.24 SYS.COM – 使磁盘可启动的实用程序

[编辑 | 编辑源代码]

在 PC 启动过程的某个阶段,控制权会转移到可执行代码,该代码从启动磁盘的引导扇区读取。反过来,此可执行代码将控制权转移到引导扇区内指定的加载程序文件。为了使磁盘能够使用 MS-DOS 7 启动,必须事先将相应的可执行代码和 MS-DOS 7 加载程序文件 IO.SYS 的名称写入磁盘的引导扇区。此外,IO.SYS 加载程序本身以及命令解释器 COMMAND.COM 和 MSDOS.SYS 文件(5.01-01)必须存在于可启动磁盘的根目录中。这些可启动条件由 SYS.COM 实用程序准备。

使磁盘可启动的命令行可能如下所示:

Sys.com C:\ A:

其中

C:\ 包含这些系统文件(IO.SYS 和 COMMAND.COM)的源目录路径示例,这些文件应复制到新磁盘。如果省略源路径,则将在用于启动 PC 的磁盘的根目录中搜索系统文件。
A 要使其可启动的磁盘的盘符名称示例。它必须被 PC 的 BIOS 识别,并且必须在同一版本的 DOS 下格式化。
注意
  1. SYS.COM 实用程序不能应用于网络磁盘、CD/DVD-ROM 和由 RAM 磁盘驱动程序或 ASSIGN.COM、JOIN.EXE 和 SUBST.EXE 实用程序创建的虚拟磁盘。
  2. SYS.COM 实用程序执行的操作是必要的,但不足以使 HDD 分区可启动。此分区必须由 FDISK.EXE(6.13)或其他类似程序在磁盘的 MBR 中标记为活动分区。引导扇区的可执行代码将仅从该单个活动分区读取以执行。
  3. 与 IO.SYS 和 COMMAND.COM 系统文件相反,MSDOS.SYS 文件(5.01-01)不会被复制。SYS.COM 会重新创建一个空的。从具有默认设置的新磁盘加载被认为更安全,因为以前的设置在其他情况下可能不适用。
  4. 在 MS-DOS 的第 8 版中,SYS.COM 实用程序已更改:它始终使用默认路径到源目录,并且不能从命令行接受此路径。

6.25 VC.COM – 文件管理器

[编辑 | 编辑源代码]

6.25-01 Volkov Commander Shell 的主要特性

[编辑 | 编辑源代码]

由 Vsevolod V. Volkov(乌克兰基辅)编写的 Volkov Commander 文件管理器 (VC) 类似于著名的 Norton Commander 文件管理器,但 VC 更紧凑,并且更灵活地适应用户的需求。虽然 VC 是一个未完成的项目,不能被认为非常好,但它是在 MS-DOS 7 下进行修复工作最舒适的选择。VC 的 4.99.07 版本,打包在 vc499.zip 存档中,可以从互联网网站 http://www.fdd5-25.net/shells.php 下载。下面描述的只是 1998 年发布的此版本。VC Shell 的最新 alpha 版本 4.99.08 发布日期为 2000 年。此最新版本打包在 vc49908a.zip 存档中,可以从网站 http://vvv.kiev.ua/download/ 下载。

VC.COM 本身不是文件管理器,它只是一个启动文件。整个 VC 发行版包括主覆盖层 VC.OVL、许多代码转换表 *.TBL 以及以下配置文件:

VC.INI – 具有通用配置设置的非文本文件。
VC.MNU – 由 F2 键击调用的菜单的配置。
VC.EXT – 由 ENTER 键击调用的后缀定义的服务。
VCARCH.EXT – 存档服务的规范。
VCEDIT.EXT – 由 F4(编辑)键击调用的后缀定义的服务。
VCVIEW.EXT – 由 F3(查看)键击调用的后缀定义的服务。

除了 VC.INI 之外,所有 VC 的配置文件都是普通文本文件,可以使用 EDIT.COM(6.09)或任何其他非格式化文本文件编辑器进行编辑。一些 VC 配置文件的示例显示在文章 6.25-02 – 6.25-04 中。

所有 VC 发行版的文件都必须存储在一个目录中,并且此目录的路径应作为环境变量 VC 的值分配。因此,文件 AUTOEXEC.BAT 应包含一行,例如:

set VC=C:\DOS\VC4

VC Shell 可以从命令行作为普通程序启动,但通常从 AUTOEXEC.BAT 文件中的最后一行自动启动,例如:

C:\DOS\VC4\Vc.com /TSR /no2E /noswap /nozoom

其中选项为

/TSR 激活 TSR 监控程序,该监控程序监视所有后来加载的 TSR 模块并在 VC Shell 关闭时卸载它们。这可能有助于释放内存,有时可以避免重新启动 PC 的必要性。相反,当 TSR 监控程序不需要时,应改为指定 /noTSR 参数。
/no2E 排除通过未公开的 INT 2E 中断(8.02-89)执行程序,为此目的使用合法的 INT 21\AX=4B00h(8.02-53)。INT 2E 更短更快,但不是可重入的,并且无法访问调用者的局部变量。如果仍然首选 INT 2E,则可以改为指定 /2E 参数。
/noswap 指示避免将 VC 的数据从内存交换到 HDD 上的文件。VC 的数据交换基于 CHS 访问,这与大型现代 HDD 不兼容。相反,在过时的 PC 上,数据交换可能是可取的,然后可以指定相反的 /swap 选项。
/nozoom 不要缩放消息窗口(缩放被采用为默认值)。

VC.COM 的其他允许选项是:

/BW 为单色显示器设置黑白调色板。/BW 的替代方案是 /LCD – 为 LCD 显示器设置特殊调色板。默认值为 16 色调色板,这对于文本视频模式 03h(A.10-1)来说是典型的。
/std 将 VC 加载到常规内存中。默认情况下,VC Shell 优先选择其他选项(如果有)。当 VC 将自身加载到常规内存中时,还可以指定
/big 加载整个 VC 的驻留模块;
/small 加载模块代码的一部分,需要从磁盘定期补充。
/XMS 指示将 VC 加载到 XMS 内存中,如果 XMS 内存管理器 HIMEM.SYS(5.04-01)已安装。/XMS 选项的替代方案是:
/noXMS 避免使用 XMS 内存;
/EMS 如果 EMM386.EXE 内存管理器(5.04-02)已安装,则优先使用 EMS 内存;
/noEMS 避免使用 EMS 内存。
/ini:Alter.ini – 使用另一个具有任意名称的配置文件(此示例中为 Alter.ini)代替 VC.INI。您可以重命名当前 VC.INI 文件,更改 VC 配置并按 Shift-F9“保存设置”:VC 将被迫创建一个新的 VC.INI 文件。因此,您可以将许多替代设置存储在不同的 *.INI 文件中。
/? 显示简短帮助。
图 5

在命令行中的所有参数之后,VC.COM 允许指定一个命令,该命令应在启动 VC Shell 本身后立即执行。例如,对于刷新之前由 ESCAPE.COM 实用程序保存的中断表内容记录,此机会可能很方便。

当 VC Shell 运行时,它在屏幕上的外观可能不同,具体取决于存储在 VC.INI 文件中的初始设置。通常,目录内容显示在一个或两个面板中,如图 5 所示。

VC Shell 的主要功能可以通过“热键”和鼠标按钮单击来访问。VC Shell 保持激活的那些“热键”按重要性递减的顺序列在下面。

Ctrl B 切换底部键栏的打开/关闭状态
F9 激活顶部功能栏
Ctrl F1 切换左侧面板的打开/关闭状态
Ctrl F2 切换右侧面板的打开/关闭状态
Tab 切换活动左侧面板/活动右侧面板
Alt F1 允许在左侧面板中选择磁盘
Alt F2 允许在右侧面板中选择磁盘
Ctrl O 切换两个面板的打开/关闭状态
Ctrl Q 切换非活动面板中快速查看窗口的打开/关闭状态
Ctrl L 切换非活动面板中磁盘信息的打开/关闭状态
Ctrl [ 将左侧面板中的路径输入命令行
Ctrl ] 将右侧面板中的路径输入命令行
Ctrl i 将所选文件的名称输入命令行
Ctrl P 切换非活动面板的打开/关闭状态
Ctrl U 交换面板
箭头 在活动面板中切换菜单项或所选文件
Home 将选择移至当前目录的开头
End 将选择移至当前目录的结尾
F2 显示用户定义的菜单(6.25-02)
F3 调用查看器以读取所选文件
F4 调用文本编辑器(如果用户已定义)
F5 将所选文件或组复制到对面面板
Ctrl F5 与 F5 相同,但仅复制一个文件,忽略组列表

F6 移动或重命名选定的文件或准备好的文件组
Ctrl F6 与 F6 相同,但仅移动一个文件,忽略文件组列表
F7 启用创建目录的功能
F8 删除选定的文件或准备好的文件组
Ctrl F8 与 F8 相同,但仅删除一个文件,忽略文件组列表
Ins 将高亮显示的项目添加到文件组操作列表中
Shift F9 将当前 VC 的设置写入 VC.INI 文件
Ctrl A 显示文件属性并启用修改属性的功能
Ctrl C 调用目录比较,标记特有文件
Ctrl E 将历史记录表中的最后一行移回命令行
Ctrl F 启用使用掩码定义选择的后缀
Ctrl N 切换面板中文件后缀的显示
Ctrl R 重新读取当前目录的内容
Ctrl F4 启用修改活动磁盘的卷标
Ctrl F9 更改显示视频模式(Alt-F9 也可更改)
Ctrl \ 在活动面板中跳转到磁盘根目录
Alt-字母键 按名称在当前目录中搜索文件
Alt F6 选定目录的大小(在面板的“完整”模式下)
Alt F8 显示以前的命令行(历史记录)
Alt F10 显示活动面板树,启用跳转到任何目录
Alt F11 启用使用向上箭头键缩短面板
Alt F12 启用使用向下箭头键延长面板
F10 退出当前会话并卸载 Volkov Commander。

一些“热键”的功能是重复的。Ctrl-J 和 Ctrl-Enter 的作用与 Ctrl-i 相同:将选定文件的名称写入命令行。Ctrl-Z 的作用与 ALT F10 相同 – 显示活动面板树。“0”在数字键盘上的作用与 INS 相同:将选定的项目添加到准备执行组操作的项目列表中。列表中包含的项目将以颜色突出显示。数字键盘上的几个键负责准备组操作的辅助功能

Ctrl + 将当前目录中的所有文件包含在文件组列表中
+ 将使用掩码选择的 文件包含在文件组列表中
Ctrl – 放弃当前的文件选择
排除使用掩码(允许使用通配符)选择的文件
Ctrl * 反转当前目录中的文件选择
* 如果当前目录中的文件列表尚未形成,则充当“+”,或者如果文件组列表已存在,则充当“–”

当准备好了一个高亮显示的项目列表时,操作 F5(复制)、F6(移动)、F8(删除)将涉及列表中的所有项目。高亮显示的项目列表作为临时文件 VCLIST.000 存在于由环境变量%Temp%定义的目录中。在 VC 配置文件(*.MNU*.EXT)中,准备好的高亮显示的项目列表可以通过特殊的宏命令!~@(对于活动面板)和%~@(对于被动面板)访问。因此,用户有机会定义自己的组操作(示例见第 6.25-02 条)。

如果 VC 的两个面板都被关闭,VC shell 提供更多机会使用左箭头和右箭头键沿命令行导航,将字符插入命令行,并使用向上和向下箭头键访问其历史记录列表。当 NUMLOCK 键关闭时,数字键盘上的箭头键以相同的方式工作。

所述 VC 版本(4.99.07)的开发尚未完成。当当前目录中存在外部*.EXT*.MNU文件,以及当归档文件在非活动面板中保持打开状态时,用户通过配置文件定义的一些功能可能会出错。一些“热键”被声明为活动状态,但实际上并非如此,或者以错误的方式工作

Alt F4 (编辑) 无效,请改用 F4
Alt F5 (内存使用情况) 无效
Alt F7 (文件搜索) 从 4.99.08 版本开始实现
Ctrl M (恢复组) 无效
Ctrl N (长文件名) 在极少数情况下可能导致挂起
Ctrl Z (显示树) 可能持续运行直到按下 ESC 键
F1 (VC 的内部帮助) 不可用
F6 (移动和重命名) 应用于目录时,禁用鼠标,强制重新加载鼠标驱动程序。

6.25-02 Volkov Commander 的菜单文件 VC.MNU。

[编辑 | 编辑源代码]

VC 广泛的适应能力是由于其菜单文件(*.MNU)和扩展文件(*.EXT)中可用的各种宏命令实现的。

在 VC 的配置文件中遇到的某些语法符号和数字组被 VC Shell 解释为对宏的调用,然后被替换为该宏返回的结果。此结果可以是名称、路径、行等。

以下是 VC 文件管理器版本 4.99.07 提供的语法符号组和相应宏的列表

![提示] 邀请从键盘输入单词。方括号内指定的字符构成在此邀请之前显示的提示。允许最多 10 个独立的类似邀请,隐式地从第 0 个到第 9 个编号。
!0!9 标记用于插入用户响应第 0 个到第 9 个编号的邀请输入的单词的副本。
!: 标记用于插入在活动面板中打开的磁盘的盘符。
%: 标记用于插入在被动面板中打开的磁盘的盘符。
!~\ 标记用于插入在 VC 的活动面板中打开的路径。返回的路径以反斜杠结尾。
%~\ 标记用于插入在 VC 的被动面板中打开的路径。返回的路径以反斜杠结尾。
!~ 标记用于插入在 VC 的活动面板中使用鼠标左键选择的的文件的短名称(无后缀)。
%~ 标记用于插入在 VC 的被动面板中使用鼠标左键选择的的文件的短名称(无后缀)。
!~.! 标记用于插入在 VC 的活动面板中使用鼠标左键选择的的文件的短名称(含后缀)。
%~.% 标记用于插入在 VC 的被动面板中使用鼠标左键选择的的文件的短名称(含后缀)。
!~@ 标记用于插入包含在 VC 的活动面板中使用鼠标右键突出显示的文件名的列表的临时文件的名称。
%~@ 标记用于插入包含在 VC 的被动面板中使用鼠标右键突出显示的文件名的列表的临时文件的名称。
!! 标记将被替换为单个感叹号。
%% 标记将被替换为单个百分号。

包含波浪号 (~) 的符号组合调用那些将“长”文件名截断为 8 个字符,“长”后缀截断为 3 个字符的宏指令。在所有此类符号组合中,都可以省略波浪号 (~),然后在 WINDOWS-95\98\ME OS 的“DOS 窗口”中执行的相同宏将返回“原样”的长文件名,不会截断。

用户有机会在菜单文件 (*.MNU) 和扩展文件 (*.EXT) 中的任何命令行中指定调用任何宏的符号组。这些文件中的所有行都可以使用非格式化文本文件的编辑器程序 (6.09) 键入。菜单的每个项目在 VC.MNU 文件中由一个标题行和至少一个命令行表示。VC 文件管理器认为命令行是那些以至少一个空格(ASCII 码 20h)开头的非空行。相反,标题行不能以空格开头。在标题行中,后跟冒号的第一组字符被解释为调用此菜单项功能的“热键”的规范。冒号右侧的其余词组被解释为表示此菜单项的名称,当菜单显示在屏幕上时。

当用户选择一个菜单项以执行时,VC 文件管理器会将用于调用任何宏的所有符号组替换为相应宏返回的数据。这在所选菜单项的标题行之后的所有命令行中立即完成。然后,这些命令行逐一发送到 COMMAND.COM 解释器以执行,该解释器为每个命令行重新调用。由于这个原因,不允许在命令行之间跳转,并且环境变量的值不能从一个命令行传输到同一菜单项中的后续命令行。当然,批处理文件正确执行的所有条件都必须满足(参见第 9 章的介绍文章)。

下面显示了 VC.MNU 文件的示例。其中提到的 Edit.com (6.09)、Fc.exe (6.12)、Scandisk.exe (6.21) 文件是从 Windows-95/98 版本中提取的程序。Arc.bat 和 Turn_off.com 文件是在本书的第 9.03-01 条和 9.05-02 条中描述的。所有这些文件都必须存在于由 %PATH% 环境变量 (2.02-02) 的值指定的目录中。由于 VC 文件管理器没有内部帮助,因此菜单第一个项目中提到的 HELP.TXT 文件意味着包含您自己编写的文本。HELP.TXT 文件的路径需要与 COMMAND.COM 解释器位于同一磁盘上。

F1:  Help
     @for %%Z in (%%comspec%%) do %%Z\
     @Edit.com /R \DOS\VC4\Help.txt
     @!:\
F4:  Search for a file or filemask in the current subtree
     @rem ![Type filename or mask to search for & press ENTER:]
     @echo.
     @if not !0"==" Dir !0 /P /A:-D /S /B
F5:  Compare a file with synonymous file in non-active panel
     @if !:!~\==%:%~\ echo Other panel must show other folder!!
     @if not !:!~\==%:%~\ Fc /L /N !~.! %:%~\!~.! > %%Temp%%\Y.t
     @if not !:!~\==%:%~\ Edit.com %%Temp%%\Y.t
     @if not !:!~\==%:%~\ del %%Temp%%\Y.t
F6:  Pack file(s) marked in the active panel into a ZIP-archive
     @Arc.bat ZIP !: !~\ !~ !~@ %: %~\
F7:  Pack file(s) marked in the active panel into a RAR-archive
     @Arc.bat RAR !: !~\ !~ !~@ %: %~\
F8:  Repair a disk with Scandisk
     @rem ![Type letter-name of the disk to repair & press Enter]
     @if not !0"==" Scandisk.exe !0: /custom
F10: Switch the PC off
     cls
     @Turn_off.com

与一个菜单项相关的每一组命令行几乎可以被视为一个批处理文件。第一个项目的目的是显示准备好的文本。但是当 DOS 被转移到 RAM 磁盘 (9.04、9.09) 时,此 RAM 磁盘的盘符无法预先知道。盘符问题通过其他方式解决:第一条命令行使命令解释器中指定的磁盘成为当前磁盘。如果 DOS 被转移,HELP.TXT 文件也会复制到同一磁盘。因此,第二条命令行中 HELP.TXT 文件的路径指的是当前磁盘的根目录,无论它是哪个。之后,第一个菜单项的最后一条命令行恢复了当前磁盘的先前分配。

第二个菜单项(使用“热键”F4 调用)提供了一个 VC 文件管理器执行查询的简单示例,以及如果用户对查询的响应不为空则条件执行命令的示例。关于使用“热键”F8 调用的第六个菜单项,也可以说相同的话。通过菜单调用 SCANDISK.EXE 程序是合理的,因为否则经常会忘记非常重要的/CUSTOM参数 (6.21),因此测试过程可能会出错。

第三个菜单项(使用“热键”F5 调用)提供了一个有用的过程,用于查找同时显示在左侧面板和右侧面板中的同义文本文件之间的差异。第一条命令行检查 VC 的面板中是否打开了不同的目录。如果是,则第二条命令行中的 FC.EXE 实用程序比较选定的文件并将报告发送到临时文件。第三条命令行在屏幕上显示此报告,第四条命令行删除临时文件。

不幸的是,所描述的查找差异的过程并没有包含所有应该进行的检查。原因是VC文件管理器在其自身的缓冲区中执行宏指令数据的替换。由于该缓冲区只有128字节长,返回的数据增加了在命令发送到命令解释器COMMAND.COM执行之前截断命令行的风险。截断的威胁是相当真实的,特别是对于第二个带有对FC.EXE的调用的命令行。除此之外,通过%PATH%环境变量调用特定版本的实用程序不够可靠(参见第6章的介绍文章),并且为每个命令行单独加载命令解释器会使执行速度变慢,尤其是在从软盘加载命令解释器时。

最好将复杂的过程安排成单独的批处理文件。这种替代方法的一个示例由批处理文件ARC.BAT(9.03-01)表示,该文件从第4和第5个菜单项中的命令行调用。批处理文件降低了命令行截断的风险,消除了对跳转、无搜索寻址和环境变量使用的限制。

最后,从VC.MNU启动的批处理文件执行速度比等效的单独命令行快得多。

注意

在VC配置文件(包括VC.MNU)的命令行中,VC文件管理器允许指定其他带有*.MNU后缀的菜单文件,即可以指定子菜单而不是对可执行实用程序的调用。这有可能构建层次菜单结构。

  1. 在VC配置文件(包括VC.MNU)中,所有以引号(')开头的行都会被跳过。这些行的其余部分可以填写注释。

6.25-03 扩展文件VC.EXT和VCEDIT.EXT。

[编辑 | 编辑源代码]

Volkov Commander能够根据所选文件的后缀对其进行特殊处理。文本配置文件VC.EXT定义了依赖于后缀的VC对ENTER键(以及鼠标左键双击)的反应。类似地,文本文件VCVIEW.EXT定义了依赖于后缀的对F3(查看)键的反应,而文本文件VCEDIT.EXT定义了对F4(编辑)键的反应。

这些文件中的后缀定义指定在行的最左边,后面必须跟着一个冒号。冒号右侧是指定要执行的命令。如果一个按键必须调用多个命令,则下一条命令的行紧随其下;这些行必须以一个或多个空格开头(而不是后缀定义)。如果后缀定义后面没有命令,则具有此后缀的文件将调用下面最近一行中指定的命令。后缀定义可以包含通配符(?*)。

每个用户都必须根据自己的需要选择通过扩展文件调用的特定程序。以下VC.EXT文件的示例并非旨在展示所有可以想到的功能,它只是反映了作者的品味。

bas: Qbasic.exe /run !~.!
bmp:
gif:
jpg:
pcx: Lxpic.com !~.! /A
1st:
diz:
doc:
lsm:
me:
rus:
txt:
?!!: @echo _______ > !@\..\t.txt
     @copy !@\..\t.txt /B + !~.! !@\..\.
     @Emagic.exe -q -n3 !@\..\t.txt
     @Svtxt.com !@\..\t.txt
htm: @echo _______ > !@\..\t.txt
     @Html2txt.com < !~.! >> !@\..\t.txt
     @Emagic.exe -q -n3 !@\..\t.txt
     @Svtxt.com !@\..\t.txt
scr: @rem ![Press ENTER to get listing or ESC to quit]
     @echo Processing goes on. Wait...
     @Debug.exe < !~.! > !@\..\Listing.txt
     @Edit.com !@\..\Listing.txt !~.!
ima:
wbt: Diskimg.mnu

所示的VC.EXT文件示例以一个简单的行开头:用QBASIC语言编写的命令文件被定向到其解释器。后者可以在MSDOS6.22版本或SFX存档OLDDOS.EXE中找到,该存档可在Microsoft的ftp服务器ftp://ftp.microsoft.com/softlib/mslfiles/上获得。您必须记住,必须在SETVER.EXE驱动程序(5.01-02)的版本表中写入相应的记录,以便在MS-DOS 7下启用QBASIC.EXE的使用。

VC.EXT文件中的下一组行将图片文件(*.BMP*.GIF*.JPG*.PCX)定向到由Stefan Peichl开发的图片查看器LXPIC.COM。此查看器的7.3版本(2002年发布),打包在存档LXPIC.ZIP中,可以从互联网网站http://hplx.pgdn.de/下载。

在VC.EXT文件中,列出了大量后缀(*.1ST*.DIZ等),这些后缀通常表示文本文件。在俄语中读取文本文件的主要问题是由各种可能的编码引起的。此问题由Sergey Gernshtein编写的实用程序EMAGIC.EXE解决。EMAGIC.EXE分析文本统计数据,确定编码类型,然后自动将文本转换为代码页CP866。包含EMAGIC.EXE实用程序的存档EMAGIC.ZIP可以从互联网ftp服务器ftp://ftp.botik.ru/pub/msdos/convert/下载。不使用代码页CP866的用户建议从VC.EXT文件中删除调用EMAGIC.EXE的行。

在屏幕上显示文本文件是Lo Hung Che为FreeDos项目编写的查看器SVTXT.COM的任务。此查看器打包在存档PG116.ZIP中,可以从服务器ftp://sunsite.unc.edu/pub/micro/pc-stuff/freedos/files/util/file/pg/下载。SVTXT.COM查看器以换行形式显示长文本行,并且能够处理无限长文件的前64 KB。SVTXT.COM查看器无法提取文本部分,但稍后可以使用EDIT.COM编辑器(6.09)执行此操作,因为已转换为代码页CP866的显示文本的副本将作为T.TXT文件保存在用于临时文件的目录中。

如果事先去除了超文本标记,则带有*.HTM后缀的超文本文件可以像普通文本文件一样处理。后者是由Shin Chan编写的HTML2TXT.COM实用程序执行的。包含HTML2TXT.COM实用程序的存档HTML2T08.LZH可以从互联网网站http://www.vector.co.jp/download/file/dos/net/fh050307.html下载。所示的超文本文件翻译序列不建议不阅读俄语的人使用。对于他们来说,最好将*.HTM文件直接发送到超文本查看器VH.EXE。此查看器打包在VIEWHT25.ZIP存档中,可以从互联网服务器ftp://ftp.bu.edu/pub/mirrors/simtelnet/msdos/html/下载。

后缀*.SCR最常标记调试器DEBUG.EXE的命令文件,但也可能存在例外。此外,执行某些调试器的命令文件可能会造成不良后果。因此,对于具有*.SCR后缀的文件,Volkov Commander会发出查询。如果用户使用ENTER键对查询做出响应,则命令文件将被发送到调试器,返回的列表将显示在屏幕上以供编辑。此过程对于更正返回列表(9.07-01)中显示的命令文件中的错误非常方便。

带有*.IMA后缀的文件是磁盘映像。这些文件可以解包或写回磁盘。对用户选择的调用需要创建一个新的子菜单。让我们将其命名为DISKIMG.MNU。在此子菜单中,写入磁盘由实用程序IMG.EXE执行,解包由实用程序DDI2HDD.EXE执行。这两个实用程序都可以在互联网ftp服务器ftp://ftp.elf.stuba.sk/pub/pc/utildisk/中分别下载,它们分别位于IMG.ARJ和DDI2HDD.ZIP存档中。下面显示了一个子菜单示例;其文本必须存储为VC其他配置文件的公共目录中的未格式化文本文件DISKIMG.MNU。在DISKIMG.MNU中,就像在VC.MNU中一样,必须在行的最左边键入“热键”的名称,前面没有空格。

F4:  Write the image onto diskette in drive A:
     @Img.exe !~.! A:
F8:  Unpack files from the diskette image
     @if not %~\"==" Ddi2hdd.exe !~.! %:%~\. /d /s
     @if %~\"==" echo Archive in passive panel must be closed
     @if not %~\"==" echo Unpacked files are in %:%~\!~ folder

在编写您自己的VC扩展文件示例时,您必须记住,除了显式指定的运算外,Volkov Commander还会执行一些隐式的依赖于后缀的处理。特别是,在解释VC.EXT文件中的所有行之后,默认情况下,选定的具有*.BAT*.COM*.EXE后缀的文件将被传递给命令解释器以执行,并且存档文件将根据VCARCH.EXT文件(6.25-04)中的规范进一步处理。如果在VC.EXT文件中指定了上述后缀,则相应文件的默认处理将被拦截,并且不会执行。由于这个原因,在VC.EXT中没有指定存档和可执行文件的后缀。

类似地,在按下F3(查看)键后,Volkov Commander仅将其内部查看器传递给未被扩展文件VCVIEW.EXT中的后缀规范拦截的文件。VC的内部查看器以二进制和文本形式显示任何文件的内容。能够“按原样”查看任何文件本身就是有价值的,因此,在我看来,不需要VCVIEW.EXT文件。如果您的意见不同,您可以编写您自己的VCVIEW.EXT版本,以所示的VC.EXT文件为例。VCVIEW.EXT和VC.EXT文件中的记录语法相同。

当在活动面板中打开的存档中选择要查看或编辑的文件时,F3和F4键都会将文件从该存档解包到临时目录%TEMP%\VC.000中。然后,VCVIEW.EXT和VCEDIT.EXT文件中的行中的!~.!标记将替换为相应的宏,该宏的名称为解包的文件,前面是该临时目录的路径。因此,F3键可以无需显式解包即可查看存档中的内容。类似地,F4键将解包的文件置于VCEDIT.EXT文件行中指定的任何操作之下。

编辑操作不如查看安全:编辑器程序可能会损坏所处理的文件,尤其是在所处理的文件不是解包的副本时。VCEDIT.EXT文件中的命令序列必须保护易受攻击的非文本文件免受意外损坏。因此,下面的示例中,二进制文件和存档被一个空操作(REM)拦截,从而避免了被损坏的风险。

bas: Qbasic.exe !~.!
bin:
cab:
com:
exe:
rar:
zip: @rem
bmp:
gif:
jpg:
pcx: Lxpic.com !~.! /A
*:    Edit.com !~.!

图片文件由单独的拦截进行保护:它允许查看档案内部的图片。所有其余文件通过星号通配符规范(而不是后缀)在最后一行定向到编辑器程序。由于 Volkov Commander 4.99.07 版本没有内置编辑器,所以在 VCEDIT.EXT 文件的示例中,EDIT.COM 编辑器(6.09)承担了此任务。

注意
  1. 所有 *.EXT 文件在 VC shell 启动时读取一次。除非关闭 VC shell 并重新启动,否则 *.EXT 文件的更改不会生效。
  2. 在 VC 的扩展文件中,所有以单引号 (') 开头的行都会被跳过。这些行的其余部分可以填写注释。

6.25-04 档案处理配置文件 VCARCH.EXT

[编辑 | 编辑源代码]

在 VC 4.99.07 版本的面板中,档案可以像目录一样打开。此功能是通过拦截归档实用程序的 STDOUT 输出并根据预定的顺序逐词解析来实现的。如果发现输出行符合顺序,则可以将此行中的选定单词识别为文件名、日期、长度等。这些数据在 VC 的面板中显示,就像普通目录一样。

由于不同归档实用程序的输出数据显示格式不相同,VC shell 必须根据由其后缀定义的档案类型调整解析顺序。不同档案类型的解析顺序模型在配置文件 VCARCH.EXT 中指定。此外,VCARCH.EXT 允许为一种类型的档案指定多个解析顺序模型,并且如果发现输出行符合至少一个模型,则会对其进行解析。

VCARCH.EXT 由每个档案类型的单独条目组成,每个条目最多 5 行。每个条目中的第一行定义档案后缀(必须在行的最左边指定)和相应的解析顺序模型。后缀与解析顺序模型之间用冒号分隔。解析顺序模型的定义由空格分隔符和大写字符组成,解释如下

A – 存储在档案内的文件的属性;
C – 压缩后文件的尺寸;
D – 最后修改的日期或天数;
L – 换行符,用于在下一行继续解析;
M – 月份;
N – 存储在档案内的文件名;
P – 存储在档案内的路径;
S – 存储在档案内的文件的原始大小
T – 最后修改的时间;
W – 要忽略的单词;
Y – 年份;
; – 解析顺序模型之间的分号分隔符;
' 或 " – 用于括住任何可识别符号或文本的引号;
\ – 解析顺序模型的第一个符号为反斜杠表示此模型引用目录。

每个条目中的接下来的四行至少以一个空格开头,并定义对相应归档实用程序的调用以执行特定操作

第 2 行 将档案内容表发送到 STDOUT。每次重新绘制面板时都会自动启动此操作。
第 3 行 解压缩选定的档案文件。如果档案在活动面板中打开,则通过 F5(复制)键击启动解压缩。
第 4 行 将文件添加到档案。如果档案在被动面板中打开,则通过 F5(复制)键击启动添加。
第 5 行 从档案中删除文件。此操作由 F8(删除)键击启动。

第 3 行中指定的解压缩操作也可以通过 F3(查看)和 F4(编辑)键启动。在这种情况下,解压缩的结果将写入临时文件目录,并根据扩展文件 VCVIEW.EXT 和 VCEDIT.EXT 中的规范立即显示以供查看或编辑。

在各种档案类型中,只有少数几种被积极用于打包。VCARCH.EXT 文件中的大部分其他条目都保留用于单一目的:用于访问在软件商店中偶尔遇到的档案类型。VCARCH.EXT 文件中此类档案类型的条目可以减少到三行。

在解释 VCARCH.EXT 文件中的命令行时,Volkov Commander 无法访问环境变量,但提供了特定宏,这些宏与其他扩展文件中可用的宏不同。VCARCH.EXT 文件中的宏命令调用由以下标记引起

!A – 用档案文件名及其前面的路径替换此标记。
!T – 用临时文件目录的路径替换此标记。
!F – 用左鼠标按钮单击选择的 filename 替换此标记。
!M – 用右鼠标按钮单击选择的一个或多个文件名替换此标记。
!@ – 用包含右鼠标按钮单击选择的文件名列表的临时文件名称替换此标记。

下面显示了 VCARCH.EXT 文件条目的示例。条目示例中提到的所有可执行文件都必须沿环境变量 %PATH%(2.02-02)的值中指定的路径访问。

ARC: N S W C W D T W
     Pkxarc.exe –v !A
     Pkxarc.exe –e !A @!@
BSA:
BSN: W S C W W D "–" M "–" Y T A L N; W S C W W D "–" M "–1" Y T A L N
     Bsa.exe v !A
     Bsa.exe x –S !A @!@
CAB: M "–" D "–" Y T A S N; N ":" W W W W W W W
     Extract.exe /d !A
     Extract.exe /e !A !M
RAR:
R0?:
R1?:
R2?: "*" N L S C W D T A W W W; N L S C W D T A W W W
     Unrar.exe v –r –w!T !A
     Unrar.exe x –r –w!T !A @!@
     Rar.exe a –std –ds –r –rr -ems- –w!T !A @!@
     Rar.exe d -std –r –rr -ems- –w!T !A @!@
TAR: A W S N L
     Tar.exe -tvf !A
     Tar.exe -xnf !A !M !F
UHA: N S D "-" M "-" Y T A
     Uharcd.exe l -y+ !A
     Uharcd.exe x !A !M !F
ZIP:
??!:
?$:
??$: S W C W D T W A N
     Pkunzip.exe –v !A
     Pkunzip.exe –d !A @!@
     Pkzip.com –b!T –P –wHS !A @!@
     Pkzip.com –b!T -d !A @!@
1:
2:
3:
4:
Z:   M "–" D "–" Y T S A C N
     Command.com /c Icomp.exe –l –h !A
     Command.com /c Icomp.exe –d –i –h !A !F

Volkov Commander 4.99.07 版本附带了 VCARCH.EXT 文件,其中包含许多档案类型的条目。本文中显示的条目示例不应被视为完整的 VCARCH.EXT 文件。这些示例代表单独的条目,它们与原始版本中的条目不同。建议的条目可以添加到原始 VCARCH.EXT 文件中,也可以替换此文件中的原始条目。建议条目中提到的所有归档程序都可以从 ftp 服务器 ftp://ftp.elf.stuba.sk/pub/pc/pack/ 上的大量归档程序集中下载。

6.26 XCOPY.EXE – 复制实用程序

[编辑 | 编辑源代码]

XCOPY.EXE 实用程序复制文件,并且可以复制目录及其所有内容,包括子目录。XCOPY.EXE 需要在同一目录中存在辅助文件 XCOPY32.EXE。调用 XCOPY.EXE 的命令行可能如下所示

Xcopy.exe D:\TEMP\*.* C:\DOS /A /D /P /S /V /W

其中

D:\TEMP\*.* – 要复制的文件的路径和掩码示例。
C:\DOS 复制的目标路径示例。
/A 仅复制设置了“A”属性的文件,并保持此属性不变。/M 选项含义相同,但“A”属性将被取消。
/D 仅复制源文件比目标目录中同名文件更新的文件。如果在 /D 参数之后指定日期(例如,/D:18/12/2003),则将复制比该日期更新的文件。[注释 2]
/P 在将每个文件复制到目标目录之前提示。
/S 复制目录和子目录,但空目录除外。同时指定 /S/E 选项将强制复制空目录。
/V 验证每个复制的文件。
/W 等待复制权限,通过按键确认(以便有时间更改源或目标存储介质)
注意
  1. 在 MS-DOS 下启动时,XCOPY.EXE 无法复制具有 H(隐藏)或 S(系统)属性的文件。只有在 Windows 的“DOS 窗口”中才能执行此功能和其他一些功能。
  2. ^/D 参数之后指定的日期格式取决于由 COUNTRY 命令(4.05)定义的国家/地区设置。无论如何,日期格式必须与 DATE 命令(3.08)返回的日期格式相同。
  3. 在 MS-DOS 8 中,辅助文件 XCOPY32.EXE 重命名为 XCOPY32.MOD。
  4. 2003 年,Rene Ableidinger 在 FreeDOS 项目中编写了一个同名的实用程序 XCOPY.EXE。此实用程序不需要辅助文件,并且能够在 MS-DOS 7 下复制具有 HS 属性的文件。包含此实用程序的档案 RXCOPY2.ZIP 可以从互联网服务器 ftp://sunsite.unc.edu/pub/micro/pc-stuff/freedos/files/dos/ 下载。
华夏公益教科书