COMMAND.COM

**COMMAND.COM**（コマンド・コム）は、MS-DOS/PC DOS及び互換DOS、およびWindows 95、Windows 98、Windows 98 SE、Windows Meにおける標準のコマンドラインインタプリタ（コマンドシェル）である。

## 概要
DOSにおいては、デフォルトのユーザインターフェイスである。MS-DOSでは、起動プロセスの中で MSDOS.SYS（PC DOSでは IBMDOS.COM）が `CONFIG.SYS` の記述「`SHELL=`」を元に起動する最初のプロセス（ルートプロセス）であり、AUTOEXEC.BATを実行してシステムをセットアップした後、全てのプロセスの祖先となる役割がある。

系では「DOSプロンプト」という名前（「プロンプト」とは「`C:&#x5c;&gt;`」のようなユーザーに入力を促すメッセージのこと）でMS-DOS互換環境のシェルとして起動された。`COMMAND.COM` は16ビットアプリであるが、そこから32ビット  アプリケーションの起動もできた。OS/2とWindows NT系ではcmd.exeにその役割を譲ったが、32ビット版のWindows NTでは互換性のためにCOMMAND.COMも付属しており、IA-32の仮想DOSマシンで利用可能である。64ビット版では16ビットアプリのサポートを終えたため削除された。

最も初期のCOMMAND.COMはわずか4kBほどであった。

というファイル名は、旧東ドイツのロボトロンによるMS-DOSの派生物である(DCP)でも使用されていた。

FreeDOSにおける互換性のあるコマンドプロセッサは、FreeComと呼ばれる。

COMMAND.COMはDOSプログラムである。COMMAND.COMから起動されたプログラムは、DOS APIを使用してディスクオペレーティングシステムと通信するDOSプログラムである。

バッチファイルは、UNIXのシェルのコマンドのようにカレントプロセスで実行されるため環境変数の変更などが可能である。またMS-DOS 5でという内部コマンドが実装される以前は、バッチ中から別のバッチを実行すると戻る方法が基本的にはなく、COMMAND.COMを明示的に再帰的に起動して、そのCOMMAND.COMに子バッチを実行させる必要があった。

## 動作モード
シェルとして、COMMAND.COMには2つの異なる動作モードがある。1つ目は対話モードで、ユーザがコマンドを入力すると即時に実行される。2番目はバッチモードで、バッチファイルと呼ばれる拡張子のファイルに書かれたコマンドを順次実行する。

## 内部コマンド
内部コマンドとは、COMMAND.COMのバイナリ内に組み込まれているコマンドである。従って、内部コマンドは常に使用可能であるが、コマンドインタープリタから直接実行することしかできない。

行の最後にキーを押すと、その行の全てのコマンドが実行される。COMMAND.COMは大文字と小文字を区別しない。すなわち、コマンドは大文字と小文字を混在させて入力することができる。

; BREAK: やを押下したときのプログラムの中断の処理を制御する。
; CHCP: 現在のシステムのコードページを変更または表示する。
; CHDIR, CD: カレントディレクトリを変更または表示する。
; CLS: 画面の表示内容を消去する。
; : ファイルをコピーする（宛先ファイルが既に存在する場合、MS-DOSはそれを置き換えるかどうかをユーザに尋ねる）。
; CTTY: 入出力に使用するデバイスを定義する。
; DATE: システム時刻の日付のみを表示または設定する。
; : ファイルを削除する。ディレクトリに対して使用すると、ディレクトリ内のファイルのみを削除する。
; DIR: 特定のディレクトリの中にあるファイルの一覧を表示する。
; ECHO: テキストを表示するか()表示しないか()を切り替える。また、指定されたテキストを画面に表示する()。
; EXIT: COMMAND.COMを終了し、それを起動したプログラムに戻る。
; LFNFOR: FORコマンドによる長いファイル名の返送を有効または無効にする(Windows 9x)。
; : プログラムを上位メモリ領域(UMA)にロードする。
; LOCK: 外部プログラムが低レベルのディスクアクセスを実行できるようにする（DOS 7.1およびWindows 9xのみ）。
; MKDIR, MD: 新しいディレクトリを作成する。
; PATH: 環境変数  を変更または表示する。この環境変数は、COMMAND.COMが実行可能ファイルを検索する場所を制御する。
; PROMPT: 環境変数  を変更または表示する。この環境変数は、コマンドプロンプトの見た目を設定する。
; : ファイルやディレクトリの名前を変更する。
; RMDIR, RD: 空のディレクトリを削除する。
; SET: 環境変数を設定する。引数がない場合は、定義されている全ての環境変数を表示する。
; : システム時刻の時刻のみを表示または設定する。
; TRUENAME: ファイルの完全に展開された物理名を表示し、ASSIGN、JOIN、論理ファイルシステムマッピングを解決する。
; : ファイルの内容を画面に表示する。
; UNLOCK: 低レベルのディスクアクセスを実行不可にする（DOS 7.1およびWindows 9xのみ）。
; : OSのバージョンを表示する。
; VERIFY: ファイルの書き込みの検証を有効または無効にする。
; : ストレージのに関する情報を表示する。

## バッチファイルコマンド
制御構造は主にバッチファイル内で使用されるが、対話モードで使用することもできる。

; *label*: GOTOコマンドの飛び先（ラベル）を定義する。
; CALL: 他のバッチファイルを起動し、その実行終了後、その後元のファイルに戻って実行を継続する。
; FOR: 繰り返し処理：一連の指定されたファイルのそれぞれに対してコマンドを実行する。
; GOTO: 指定したラベルに実行を移動する。ラベルは、行の先頭にコロンで指定される。
; IF: 条件分岐。条件によりプログラムの実行を分岐する。
; PAUSE: プログラムの実行を停止し、続行するには任意のキーを押すようユーザに求めるメッセージを表示する。
; REM: 何もしないコマンド。このコマンドに渡された引数は全て無視される。リダイレクトなどは効果を持つため、コメントにするためにはクォートする必要がある。
; SHIFT: バッチファイルの引数を参照するパラメータ（置換パラメータ）を後続のパラメータに置き換える（例： を、をなど）。

## IFコマンド
全ての外部コマンドは、終了時に終了ステータス/として0〜255の値を呼び出し側プログラムに送信する。ほとんどのプログラムには、戻り値に特定の規則がある（実行に成功した場合は0など）。

COMMAND.COMから外部プログラムを呼び出した場合、IFコマンドで環境変数ERRORLEVELを参照することで、最後に呼び出した外部プログラムのエラー状態をテストできる。

## 変数
COMMAND.COMのバッチファイルでは、以下の4種類の変数を使用することができる。
* 環境変数: %VARIABLE%の形式であり、SET文で値を設定する。
* 置換パラメータ: , ...の形式で、コマンド名と最初の9つのコマンドライン引数がスクリプトに渡される。例えば、呼び出しコマンドが""の場合、は"myscript.bat"、は"John"、は"Doe"である。10番目以降の引数は、SHIFT文を使用して参照範囲をずらすことで参照できる。
* ループ変数: ループ内で使用され、バッチファイルで実行される場合、の形式になる。この変数は、特定のFOR文の中でのみ定義され、そのFOR文で定義された特定の値の回数だけ反復処理する。
* Novell DOS 7、OpenDOS 7.01、DR-DOS 7.02以降では、COMMAND.COMは多くのシステム情報変数を使用できる。この機能は、4DOS 3.00以降やMultiuser DOSでも使用できるが、対応している変数名はほとんどが異なる。

## リダイレクト、パイプ、チェーン
DOSはシングルタスクのOSであるため、パイプライン処理は、コマンドを連続して実行し、に結果をリダイレクトしたり、一時ファイルから入力をリダイレクトしたりすることで実現している。ただし標準エラー出力のリダイレクトはCOMMAND.COMには実装されていない。

; `''command'' < ''filename''` : 標準入力をファイル（またはデバイス）からリダイレクトする。
; `''command'' > ''filename''` : 標準出力をファイルにリダイレクトする。ファイルが存在する場合は上書きする。
; `''command'' >> ''filename''` : 標準出力をファイルにリダイレクトする。ファイルが存在する場合は追記する。
; `''command1'' | ''command2''` : *command1*の標準出力から*command2*の標準入力にパイプする。
; `''command1'' ¶ ''command2''` : 
:ASCIIコード20（¶で示す。装置制御4、で入力できる）で区切られたコマンドを順番に実行する（コマンドのチェーン）。つまり、最初の*command1*が終了まで実行され、次に*command2*が実行される。これは、 MS-DOS/PC DOS 5.0以降のCOMMAND.COMに実装されている、文書化されていない機能である。また、Windows NT系のCOMMAND.COMやDR-DOS 7.07でも対応している。全てのバージョンのDR-DOSのCOMMAND.COMでは、代わりに感嘆符(!)を使用する同様の内部機能が既に実装されていた（Concurrent DOSやMultiuser DOSから派生した機能）。ただし、シングルユーザーの行では、この機能は内部（"!DATE!TIME"のような組み込みのスタートアップスクリプト）やDOSKEYの$Tパラメータを介して間接的にのみ利用可能だった。4DOSは、変更可能なコマンドラインセパレータに対応しており、デフォルトでは"^"だった。Windows NTの新しいバージョンのCOMMAND.COMは、OS/2やWindows NT系のcmd構文との互換性のために&区切り文字にも対応している（ただし、cmd.exeは¶セパレータに対応していない）。

## 制限
対話モードにおいて、コマンドラインの文字数は126文字以内に制限されている。

## 大衆文化において
ターミネーターシリーズに登場するアンドロイドT-800のヘッドアップディスプレイや、ロボコップの再起動時の内部ビューポートには、"Loading COMMAND.COM"というメッセージが表示される。

カナダのアニメーション『リブート』は、コンピュータの中を舞台としており、システム（都市に相当）のリーダーは"COMMAND.COM"と呼ばれる。

## 関連項目
*  / IO.SYS - コマンドプロセッサを最初のプロセスとして起動する。
* CONFIG.SYS - SHELLコマンドで起動するシェルを変更することができる。デフォルトではCOMMAND.COMになる。
*  / NDOS - COMMAND.COMの代替として開発されたサードパーティ製のコマンドラインインタプリタ
* MS-DOS Shell / ViewMAX - 代替のDOSシェル
* 
* コンカレントCP/M / 

## 脚注

## 参考文献
* 
* 
*  https://archive.today/20190501023329/http://www.delorie.com/opendos/archives/browse.cgi?p=opendos/2004/06/17/06:23:16https://archive.today/20190428182007/http://www.fybertech.com/misc/qwkview/qwkview.pl?conf=3010