Cmd.exe

**cmd.exe**は、マイクロソフトのWindows NT系列オペレーティングシステムに標準搭載されるコマンドラインインタプリタである。Windowsにおける文字入力による操作環境の一つとして位置づけられ、利用者が入力したコマンドの解釈と実行を通じて、ファイル管理、プログラムの起動、バッチ処理の実行などに利用される。

DOSで使用されたCOMMAND.COMと機能的な連続性を持ちながら、32ビットまたは64ビットのコンソールアプリケーションとして実装され、拡張されたコマンド処理機能やシステム管理機能を備える。

## 新機能
WindowsにおいてコマンドプロンプトはCOMMAND.COMとある程度の互換性を持つが、次の拡張が施されている。

*COMMAND.COMでの「コマンドまたはファイル名が違います。」よりも詳細なメッセージを出力するようになった。OS/2ではシステムで選択された言語でエラーが表示され、そのメッセージは「システムメッセージファイル」より取得される。
*矢印キーを使ったコマンド履歴のスクロールをサポート。この機能はCOMMAND.COMでは外部コマンドのDOSKEYでサポートされていた。
*ファイルやフォルダーパスのコマンドライン補完をサポート（既定ではキーに割り当てられている）
*「^」をエスケープ文字として扱う。つまり、次のコマンドプロンプトで特別な意味を持つ文字の前にキャレットを付けることで、リテラルとして扱うことができる。（例：`&lt;`, `&gt;`, `*`, `?`, `|`）
*バッチ処理において変数の遅延展開をサポート（Windows 2000以降）

また、内部コマンドが次のように改善されている。

*`DelTree`コマンド（ディレクトリとそれ以下のファイル・ディレクトリを削除）は`RD`コマンドに`/S`スイッチとして統合。
*`SetLocal`コマンドや`EndLocal`コマンドで環境のスコープを限定。例えば、SetLocalコマンド後にバッチファイルなどにより変更された環境変数は、EndLocalコマンドを実行するとSetLocalコマンド実行前の状態に復元される。
*`Call`コマンドでバッチファイル内のサブルーチンの呼び出しをサポートした。COMMAND.COMでは外部バッチファイルの呼び出しのみをサポートしていた。
*C Shellと互換性があるファイル名修飾子（`%f`など）
*カレントディレクトリを変更した後から過去のカレントディレクトリに戻ることができる、`PushD`、`PopD`コマンド
*`IF`コマンドで大文字・小文字を区別した文字列比較、数値比較、ブロック記述をサポート。
*`SET`コマンドで数値の演算代入をサポート
*`REM`がコメントになった。COMMAND.COMでは何もしないコマンドだった。

## 後継および将来性
cmd.exeの後継は.NET Framework/.NET Coreをベースにオブジェクト指向言語として再構築されたPowerShellであり、Windowsコマンドと比べて高い柔軟性と記述性を持つ。いくつかのWindowsコマンドに関して互換エイリアスが用意されているなど、ある程度の互換性も持っているが、完全な上位互換ではなく、コマンドプロンプトとは依然として共存関係にある。マイクロソフトはcmd.exe廃止の噂に関しては全面否定しており、例えばWindows自身をビルド＆テストするために自動化されたシステムにおいてcmd.exeに依存した多数のスクリプトが利用されていることなどから、将来的にWindowsから取り除かれることはないとしている。

## Windowsエクスプローラーとの統合
Windows 7のエクスプローラーでは、Shiftキーを押しながらコンテキストメニューを表示すると、「コマンド ウィンドウをここで開く」というメニューコマンドが出現する。このコマンドを実行することで、指定フォルダーをカレントディレクトリに設定した状態でコマンドプロンプトを起動することができる。

Windows 8.1ではスタートボタンを右クリックする、またはWindowsキーを押しながらXキーを押すことでシステムコマンドメニューが表示され、コマンドプロンプトを通常権限または管理者権限で起動することができる。

Windows 10 Creators Update (バージョン1703) では、既定のコマンドシェルがPowerShellに置き換えられ、エクスプローラー上でShiftキーを押しながらコンテキストメニューを表示すると「PowerShell ウィンドウをここに開く」というメニューコマンドが出現するようになり、またシステムコマンドメニューにはコマンドプロンプトの代わりにPowerShellが表示されるようになった。ただし設定変更により従来通りコマンドプロンプトをシステムコマンドメニューに表示させることも可能である。

## 文字コード
### コマンドプロンプトの文字コード
コマンドプロンプト（cmd.exe）自体が使用している文字コードはUnicode (UTF-16) であり、（コマンドからの出力がUnicodeでありフォントがあれば）Unicode特有の文字を問題なく画面に表示することができる。ただしバッチファイルはCOMMAND.COMとの互換性維持の観点から、Windowsのシステムロケール設定（「Unicode対応ではないプログラムの言語」のこと、表示言語とは異なる）と同じ「ANSIコードページ」でエンコードされているという前提で解釈される。例えばシステムロケール設定が日本語の場合、既定でMicrosoftコードページ932 (CP932, Shift_JIS) が使われる。ただしバッチファイルからコマンドを実行して画面に出力する場合に文字コード変換が行われることはない。コマンドプロンプトで使用するANSIコードページはシステムロケール設定を変更する他、`chcp`コマンドによってコマンドプロンプトごとに一時的に変更することが可能であり、例えばコードページ65001に設定するとUTF-8として解釈される。UTF-16LE（コードページ1200）はANSIコードページと互換性がないためサポートされない。

### 内部コマンドの文字コード
コマンドプロンプトに内蔵されている**内部コマンド**（`type`や`dir`など）はUnicode出力とANSIコードページ出力の両方に対応しており、単独で実行して画面に表示する場合はUnicodeで出力される。ただし内部コマンドの出力先が画面以外（リダイレクトやパイプ）である場合は、現在のANSIコードページに変換して出力する。この挙動は`cmd.exe`のデフォルト（`/A`オプション）設定時の動作であり、`/U` オプションを付けて起動することでUTF-16出力に変更することが可能である。バイト順マーク (BOM) はテキストとして保存した場合に必要なものであるため付与されない。

### 外部コマンドの文字コード
Windowsではアプリケーションソフトウェアの一形態として、コマンドラインインターフェイス (CLI) を持つ「コンソールアプリケーション」があり、これは単独で動作させることができるだけでなくコマンドプロンプト上で動作させることもできる。これにより、ユーザーが**外部コマンド**として独自のコマンドを開発し、リダイレクトやパイプを駆使してバッチ処理に応用することができる。

外部コマンドが出力する文字コードはその外部コマンドの実装によって異なり、一般にコマンド開発者はCLIコマンドの出力をUnicodeモードで行なうか、MBCSモードで行なうかを選ぶことができる。例えばC言語の場合は`_setmode()`関数を呼び出すことで設定できる。.NET Frameworkの場合は`System.Console.OutputEncoding`プロパティで設定できる。`_setmode()`で設定可能なUnicodeモードは更に`_O_U16TEXT`モード、`_O_U8TEXT`モード、`_O_WTEXT`モードに細分化されるが、いずれであってもコマンドプロンプトはそれらを正しく解釈し、現在のコードページに関係なくUnicode出力として扱い正しく画面に表示する。MBCSモードで出力した場合は現在のコードページの設定に従って内部的にUnicodeに変換され画面に表示される。

なお、`ipconfig`など、Windowsに標準搭載されている外部コマンドは入出力をMBCSモードで行なっている。ただしシステムロケール設定に応じて表示言語を切り替えている。

仮にコマンドプロンプト上でUnicode入出力を行なう独自コマンドを開発する場合は、入出力をUnicodeモードで行なうことで実現できる。またバッチファイルによる読み取りを考慮する場合は、コマンドの入出力をUTF-8とし、バッチファイルをUTF-8で記述し、コードページを`chcp 65001`によってUTF-8に変更することでUnicodeの入出力に対応することができる。

## 脚注

## 関連項目
* キャラクタユーザインタフェース (CUI, CLI)
* シェル
* バッチファイル
* PowerShell

## 外部リンク
* Cmd | Microsoft Docs
* Command Prompt: frequently asked questions - Windows Help, Internet Archive