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或Ctrl控制程序中斷。

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輸入）分隔的命令將被連續執行（即命令的「連接」）。也就是說，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電腦的相似實現）

## 外部連結

- https://github.com/microsoft/MS-DOS/blob/master/v2.0/source/COMMAND.ASM – Source code to COMMAND.COM version 2.11 released by Microsoft as part of MS-DOS 2.0
- https://github.com/microsoft/MS-DOS/blob/master/v1.25/source/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

## 基本資料

- 其他名稱：MS-DOS Prompt、Windows Command Interpreter
- 開發者：Seattle Computer Products, IBM, Microsoft, The Software Link, Datalight, Novell, Caldera
- 發行日期：1980年
- 繼任：cmd.exe
- 程式語言：x86 彙編語言
- 作業系統：86-DOS、MS-DOS、PC DOS、DR-DOS、SISNE plus、PTS-DOS、ROM-DOS、OS/2、Windows 9x、Windows NT (NTVDM)、FreeDOS、MSX-DOS
- 平台：16位 x86
- 類型：命令行解釋器