COMMAND.COM

**COMMAND.COM** 是 MS-DOS、Windows 95、Windows 98、Windows 98SE 和 Windows Me 下預設的命令列直譯器。在 DOS 環境下，它也是預設使用者介面。它一般還是系統啟動後執行的第一個程式（即 init），因此負責執行 AUTOEXEC.BAT 設定檔以設定系統環境，也是所有處理程序的父處理程序。

COMMAND.COM 在 OS/2 和 Windows NT 上的繼任者是 cmd.exe。即便如此，COMMAND.COM 在這些系統的 IA-32 版本上的 DOS 虛擬機器中仍然可用。

檔名 COMMAND.COM 也被 Disk Control Program (DCP)—— 前東德公司 VEB Robotron 發行的 MS-DOS 變體使用。

FreeDOS 下與之相容的命令處理程式有時也稱作 FreeCom。

COMMAND.COM 是 DOS 程式。由 COMMAND.COM 啟動的程式都是 DOS 程式，呼叫 DOS API 與磁碟作業系統通信。

## 操作模式

作為一個使用者介面，COMMAND.COM 有兩種截然不同的操作模式。第一種是互動模式，使用者輸入的指令會被立即執行；第二種是批次處理模式，負責執行儲存在名稱以.BAT 結尾文字檔案中的一組預定義命令。

## 內部命令

內部命令是直接儲存於 COMMAND.COM 二進位檔案中的命令。因此，它們一直可用，但只能直接執行於命令直譯器。

當 `↵ Enter` 鍵在一行末尾按下後，所有命令才被執行。COMMAND.COM 不區分大小寫，也就是說命令可以按照任意大小寫組合輸入。

**BREAK**
: 通過 `Ctrl`+`C` 或 `Ctrl`+`Break` 控制程式中斷。

**CHCP**
: 顯示或更改當前系統的頁碼。

**CHDIR, CD**
: 更改當前工作目錄或顯示當前處於的目錄。

**CLS**
: 清除螢幕顯示。

**COPY**
: 將一個檔案複製到另一個位置（若目的檔已存在，MS-DOS 會詢問是否替換）。（另請參見 XCOPY，一個可以複製目錄樹的外部命令）

**CTTY**
: 定義輸入輸出所用的裝置。

**DATE**
: 顯示和設定系統日期。

**DEL, ERASE**
: 刪除一個檔案。在對一個目錄操作時，僅刪除目錄下的所有檔案。與之相對，外部命令 command 不僅刪除目錄下的全部子目錄及所有檔案，也刪除目錄本身。

**DIR**
: 列出指定目錄下的檔案。

**ECHO**
: 切換文字顯示開啟（`ECHO ON`） 或關閉（`ECHO OFF`）。也用於在螢幕上顯示字元（`ECHO text`）。

**EXIT**
: 登出 COMMAND.COM 並返回到啟動它的程式。

**LFNFOR**
: 開啟 / 關閉 FOR 命令返回長檔名的功能（Windows 9x）。

**LOADHIGH, LH**
: 將一個程式載入記憶體的高位址區域（相當於 DR-DOS 的 `HILOAD`）。

**LOCK**
: 允許外部程式執行低層磁碟存取（僅 MS-DOS 7.1 和 Windows 9x）。

**MKDIR，MD**
: 新建一個目錄。

**PATH**
: 顯示或更改控制 COMMAND.COM 尋找可執行檔位置的 PATH 環境變數值。

**PROMPT**
: 顯示或更改控制命令列外觀的 PROMPT 環境變數值。

**RENAME, REN**
: 重新命名一個檔案或目錄。

**RMDIR, RD**
: 刪除一個空目錄。

**SET**
: 設定一個環境變數的值；無參數時，顯示全部已定義的環境變數。

**TIME**
: 顯示和設定系統時間。

**TRUENAME**
: Display the fully expanded physical name of a file, resolving ASSIGN, JOIN and SUBST logical filesystem mappings.

**TYPE**
: 在控制台上顯示檔案內容。

**UNLOCK**
: 關閉低層磁碟存取（僅 MS-DOS 7.1 和 Windows 9x）。

**VER**
: 顯示作業系統版本。

**VERIFY**
: 開啟 / 關閉檔案寫入驗證。

**VOL**
: 顯示卷宗的資訊。

## 批次處理命令

控制結構多用於批次檔中，即使也可以在互動模式下使用。

**:_label_**
: 定義 GOTO 的目標。

**CALL**
: 執行另一個批次檔，然後返回到原檔案並繼續。

**FOR**
: 迭代：為每一個特定組的檔案重複一個命令。

**GOTO**
: 將執行過程強行跳轉到一個特定標籤。標籤在一行的開始處指定，以冒號開始（`:likethis`）。

**IF**
: 條件語句，建立程式分支。

**PAUSE**
: 暫停程式執行，向使用者顯示訊息「按任意鍵繼續」。

**REM**
: 注釋：此命令後所有文字被忽略。

**SHIFT**
: 將每個可換位參數（Replacement parameters）以其後一個替代（即用 `%1` 替代 `%0`，用 `%2` 替代 `%1` 等）

## IF 命令

在登出的時候，所有外部命令都會向呼叫者給出一個介於 0 到 255 之間的返回碼。絕大多數程式對於它們的返回碼有一些約定，例如使用 0 表示成功執行。

如果程式是由 COMMAND.COM 呼叫的，那麼使用 ERRORLEVEL 作為條件句的 IF 內部命令可以用於判斷最後呼叫的外部程式的錯誤狀態。

在 COMMAND.COM 中，內部命令不產生新的值。

## 變數

COMMAND.COM 批次檔允許四種變數類型：

* 環境變數：形如 `%VARIABLE%`，使用 SET 語句賦值。在 DOS 3 之前，COMMAND.COM 僅會在批次處理模式中展開環境變數，或者說在命令提示字元中不能使用。
* 可換位參數：形如 `%0`, `%1`...`%9`，預設包含命令名稱和傳遞給指令碼的前九個命令列參數（例如，如果呼叫命令「`myscript.bat John Doe`」，那麼 `%0` 是 「`myscript.bat`」，`%1` 是「`John`」，`%2` 是「`Doe`」）。第九個之後的參數可以使用 SHIFT 語句移動到前九個的範圍內。
* 迴圈變數：在批次檔中形如 `%%a`，使用於迴圈中。這些變數僅由一個特定的 FOR 語句定義，然後在該語句中遍歷一系列給定的值。
* 在 4DOS 3.00 及其後續版本和 Multiuser DOS 中，COMMAND.COM 還支援一系列系統環境變數，後來 Novell DOS 7、OpenDOS 7.01、DR-DOS 7.02 也跟進了這個功能，雖然它們所支援的變數名幾乎完全不同。

## 重新導向、管道及連接

由於 DOS 是單使用者作業系統，管道由按順序執行多個命令並重新導向到臨時檔案（或從臨時檔案重新導向）實現。COMMAND.COM 不支援重新導向到標準錯誤輸出。

**`_command_ < _filename_`**
: 從一個檔案或裝置重新導向標準輸入

**`_command_ > _filename_`**
: 重新導向標準輸出，若檔案存在則覆蓋目的檔

**`_command_ >> _filename_`**
: 重新導向標準輸出，若檔案存在則追加到目的檔結尾

**`_command1_ | _command2_`**
: 將 _command1_ 的標準輸出管道至 _command2_ 的標準輸入

**`_command1_ ¶ _command2_`**
: 由 ASCII-20（¶, 用 `Ctrl`+`T` 輸入）分隔的命令將被連續執行（即命令的「連接」）。 也就是說，_command1_ 執行完畢後才會執行 _command2_。 這是 MS-DOS/PC DOS 5.0 及更高的 COMMAND.COM 中一個未在文件中寫明的功能。 這項功能也得到 Windows NT 系列與 DR-DOS 7.07 下的 COMMAND.COM 支援。DR-DOS 下所有版本的 COMMAND.COM 支援一個類似的內部函式，但由感嘆號 (!) 呼叫（一項最初由 Concurrent DOS 和 Multiuser DOS 衍生的功能）。 然而，在單使用者命令列環境下，這個功能只在內部（如內建的 "!DATE!TIME" 啟動指令碼）或間接通過 DOSKEY 的 $T 參數可用，以避免因！可作為有效檔案名字符產生問題。 4DOS 支援可組態的命令列分隔符（4DOS.INI CommandSep= 或 SETDOS /C）, 預設為「^」。在更高版本的 Windows NT 下，COMMAND.COM 還支援 `&` 分隔符，以提供與 OS/2 及 Windows NT 系列 cmd 語法的相容性（然而 cmd 不支援 ¶ 分隔符）。

## 限制

互動模式下命令列長度不得超過 126 字元。在 MS-DOS 6.2.2 中，互動模式的命令列長度限制為 127 字元。

## 流行文化

當終結者重新啟動時，在終結者的 HUD 視圖中和機械戰警的內部視圖中顯示有「正在載入 COMMAND.COM」（Loading COMMAND.COM）。

在電腦製作的動畫連續劇 ReBoot 中（該劇的背景發生在電腦內部），系統（相當於城市）的領導者被稱為 COMMAND.COM。

## 參見

* UEFI Shell（UEFI Shell 參考了大量來自 COMMAND.COM 的指令）
* IBMBIO.COM/ IO.SYS (starts the command processor as the first process)
* SHELL (CONFIG.SYS directive) (to override default command processor)
* COMSPEC (環境變數)（由 COMMAND.COM 設定，reload transient portion of itself）
* CMDLINE (環境變數)（由 COMMAND.COM 設定，用於與外部程式傳遞較長的命令列）
* 4DOS / NDOS （第三方的命令處理器）
* DOSSHELL / ViewMAX （另一種 DOS shells）
* MS-DOS 命令列表
* 不同命令列的比較
* Concurrent DOS/Multiuser DOS/REAL/32 （有相似的命令處理器，但不叫 COMMAND.COM）
* PC-MOS/386 （有相似的命令處理器，也叫 COMMAND.COM）
* Transient Program Area (TPA) (area available for use either by the running application or the transient portion of COMMAND.COM)
* SpartaDOS X （一個用於 Atari 電腦的相似實現）

## 參考資料

## 延伸閱讀

* Cooper, Jim. Special Edition Using MS-DOS 6.22 3. Que Publishing. 2001. ISBN 978-0-78972573-8.
* Wolverton, Van. MS-DOS Commands: Microsoft Quick Reference 4th revised. Microsoft Press. 1990. ISBN 978-1-55615289-4.
* Paul, Matthias R. Re: Random Lockups with DR-DOS 7.03. FidoNet conference: ALT\_DOS. 2004-06-17 [2019-04-28]. （原始內容存檔於 2019-04-28）. […] all MS-DOS versions prior to Windows 95 […] used a COM style COMMAND.COM file which has a special signature at the start of the file […] queried by the MS-DOS BIOS before it loads the shell, but not by the DR-DOS BIOS […] COMMAND.COM would […] check that it is running on the "correct" DOS version, so if you would load their COMMAND.COM under DR-DOS, you would receive a "Bad version" error message and their COMMAND.COM would exit, so DR-DOS would […] display an error message "Bad or missing command interpreter" (if DR-DOS was trying to load the SHELL= command processor after having finished CONFIG.SYS processing). In this case, you could enter the path to a valid DR-DOS COMMAND.COM (C:\DRDOS\COMMAND.COM) and everything was fine. Now, things have changed since MS-DOS 7.0 […] COMMAND.COM has internally become an EXE style file, so there is no magic […] signature […] to check […] thus no way for DR-DOS to rule out an incompatible COMMAND.COM. Further, their COMMAND.COM no longer does any version checks, but […] does not work under DR-DOS […] just crashes […] the PC DOS COMMAND.COM works fine under DR-DOS […]  [8][9]

## 外部連結

* GitHub 上的 COMMAND.ASM 頁面 – Source code to COMMAND.COM version 2.11 released by Microsoft as part of MS-DOS 2.0
* GitHub 上的 COMMAND.ASM 頁面 – Source code to COMMAND.COM version 1.17 released by Microsoft as part of MS-DOS 1.25
* FreeCom （頁面存檔備份，存於網際網路檔案館） – COMMAND.COM implementation of FreeDOS