cmd.exeは、OS/2やNT系Windows、Windows CEに搭載されている
コマンドラインインタプリタです。英語版では「Command Prompt」、日本語版では「コマンド プロンプト」として知られています。これは、
MS-DOSからWindows 9x時代に使われていたCOMMAND.COM(および
DOSプロンプト)と似た機能を提供し、
Win32コンソールAPIを使って実装されています。
32bit版と64bit版
64ビット版Windowsには、64ビットのcmd.exeと、
WOW64で実行される32ビットのcmd.exeの両方がインストールされています。
Windows 9x系の
DOSプロンプトが16ビットプログラムなのに対し、cmd.exeは32ビットまたは64ビットで動作するコンソールプログラムです。
機能の進化
cmd.exeは、COMMAND.COMと比較して大幅に機能が向上しています。一時的に削られた
エスケープシーケンス機能も、Windows 10 1607で復活し、VT100互換の
エスケープシーケンスが利用できるようになりました。
拡張機能
Windowsの
コマンドプロンプトは、COMMAND.COMとの互換性を保ちつつ、以下のような拡張が施されています。
詳細なエラーメッセージ: 「コマンドまたはファイル名が違います。」というエラーメッセージよりも詳細な情報を提供するようになりました。エラーメッセージはシステムで選択された言語で表示され、システムメッセージファイルから取得されます。
コマンド履歴: 矢印キーでコマンド履歴をスクロールできます。この機能は、COMMAND.COMでは外部コマンドのDOSKEYでサポートされていました。
コマンドライン補完: ファイルやフォルダーパスのコマンドライン補完をサポートしています。(デフォルトではTabキーに割り当てられています)
エスケープ文字: 「^」をエスケープ文字として扱い、特別な意味を持つ文字(<, >, , ?, | など)を
リテラルとして使用できます。
変数の遅延展開: バッチ処理において、変数の遅延展開をサポートしています(Windows 2000以降)。
内部コマンドの改善
内部コマンドにも以下のような改善が見られます。
DelTreeコマンドの統合: DelTreeコマンド(ディレクトリとその下のファイル・ディレクトリを削除)は、RDコマンドに/Sスイッチとして統合されました。
環境のスコープ: SetLocalコマンドとEndLocalコマンドで環境のスコープを限定できます。これにより、バッチファイルなどで変更された
環境変数を、EndLocalコマンドでSetLocalコマンド実行前の状態に戻すことができます。
サブルーチン呼び出し: Callコマンドでバッチファイル内の
サブルーチンを呼び出せるようになりました。COMMAND.COMでは外部バッチファイルの呼び出しのみがサポートされていました。
ファイル名修飾子: C Shellと互換性のあるファイル名修飾子(%fなど)が使用できます。
カレントディレクトリ: PushDコマンドとPopDコマンドで、カレントディレクトリの変更と復元が可能です。
IFコマンドの強化: IFコマンドで大文字・小文字を区別した文字列比較、数値比較、ブロック記述がサポートされました。
SETコマンドの強化: SETコマンドで数値の演算代入をサポートしました。
REMコマンド: REMがコメントとして扱われるようになりました。COMMAND.COMでは、REMは何もしないコマンドでした。
後継と将来性
cmd.exeの後継として、
.NET Framework/.NET Coreをベースにした
PowerShellが登場しました。
PowerShellは、より高い柔軟性と記述性を持つオブジェクト指向言語で、いくつかのWindowsコマンドに関して互換エイリアスが用意されています。しかし、完全な上位互換ではなく、cmd.exeと
PowerShellは共存関係にあります。
マイクロソフトはcmd.exeの廃止を否定しており、自動化システムでの依存性などから、将来的にWindowsから削除されることはないとしています。
Windowsエクスプローラーとの統合
Windowsエクスプローラーでは、Shiftキーを押しながら
コンテキストメニューを表示すると、「コマンド ウィンドウをここで開く」というメニューコマンドが表示され、指定したフォルダーをカレントディレクトリとして
コマンドプロンプトを起動できます。
Windows 8.1では、スタートボタンの右クリックまたはWindowsキー+Xで表示されるシステムコマンドメニューから、
コマンドプロンプトを通常権限または管理者権限で起動できます。
Windows 10 Creators Updateでは、デフォルトのコマンド
シェルが
PowerShellに置き換えられましたが、設定変更で従来の
コマンドプロンプトを使用することも可能です。
文字コード
cmd.exe自体は
Unicode (
UTF-16) を使用しており、
Unicodeの文字を問題なく表示できます。ただし、バッチファイルはCOMMAND.COMとの互換性を維持するため、システムロケール設定(ANSIコードページ)でエンコードされているものとして解釈されます。システムロケール設定が日本語の場合、デフォルトで
Microsoftコードページ932 (CP932, Shift_JIS) が使用されます。バッチファイルからコマンドを実行して画面に出力する場合、文字コード変換は行われません。
内部コマンドの文字コード
内部コマンド(typeやdirなど)は、
Unicode出力とANSIコードページ出力の両方に対応しており、単独で実行した場合は
Unicodeで出力されます。しかし、出力先が画面以外(リダイレクトやパイプ)の場合は、現在のANSIコードページに変換して出力されます。これはデフォルト設定(/Aオプション)時の挙動で、/Uオプションで起動することで
UTF-16出力に変更できます。
外部コマンドの文字コード
外部コマンドの文字コードは実装によって異なり、
UnicodeモードまたはMBCSモードを選択できます。
C言語では_setmode()関数、
.NET FrameworkではSystem.Console.OutputEncodingプロパティで設定可能です。cmd.exeは
Unicode出力を正しく解釈し、MBCSモードの場合は現在のコードページ設定に従って
Unicodeに変換して表示します。
Windowsに標準搭載されている外部コマンド(ipconfigなど)はMBCSモードで入出力を行っています。独自にコマンドを開発する場合は、入出力を
Unicodeモードで行うことで
Unicode入出力に対応できます。また、バッチファイルで読み取る場合は、コマンド入出力を
UTF-8、バッチファイルを
UTF-8で記述し、コードページをchcp 65001で
UTF-8に変更することで
Unicodeに対応できます。
脚注
Cmd | Microsoft Docs
Command Prompt: frequently asked questions - Windows Help, Internet Archive
関連項目
キャラクタユーザインタフェース (CUI, CLI)
シェル
バッチファイル
PowerShell