Cmd.exe

cmd.exe: Windowsのコマンドラインインタプリタ



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

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。