Cmd - DOS/コマンドプロンプト コマンド一覧
Windows NT 系/XP 以降のコマンド インタープリター(「コマンドプロンプト」)です。「ファイル名を指定して実行」(Windowsキー+Rキーで開く)で「cmd」と入力して実行すると、コマンドプロンプトのウィンドウを開くことができます。
(使い方については「解説」をご覧ください。)
構文
cmd[.exe] [/A | /U] [/Q] [/D] [/E:ON | /E:OFF | /X | /Y] [/F:ON | /F:OFF] [/V:ON | /V:OFF] [[/S] /C <command> | /K <command>]
オプション一覧
- /A | /U
- 出力をANSIで出力(/A)するかUnicode(UTF-16)で出力(/U)するかを指定します。
- /Q
- エコーがOFFの状態でプロンプトを起動します(「echo off」があらかじめ実行された状態)。
- /D
- レジストリのAutoRunの設定を無効にし、これらで指定されているコマンドが実行されないようにします。
- /E:ON | /E:OFF | /X | /Y
- プロンプト起動時のコマンド拡張機能を有効にするかどうかを設定します。「/E:ON」を設定すると有効に、「/E:OFF」を設定すると無効になります。指定しない場合はレジストリのEnableExtensionsの設定が使用され、これらも存在しない場合は有効になります(未確認)。
- コマンド拡張機能はバッチファイル内のSetlocalコマンドで動的に変更することもでき、このコマンドによる設定が優先されます(ただしプロンプト上ではSetlocalで変更しても効果がありません)。
- 「/X」は「/E:ON」と、「/Y」は「/E:OFF」とそれぞれ同じ意味を持ちます。
- /F:ON | /F:OFF
- ファイルやディレクトリの名前補完機能を使えるようにするかどうかを設定します。「/F:ON」で有効にしてプロンプトを起動した場合、「Ctrl+F」(文字コード0x06の文字を入力)でファイル名を、「Ctrl+D」(文字コード0x04の文字を入力)でディレクトリ名を補完できるようになります。この場合はレジストリでの設定を無視します。
- このオプションを指定しなかった場合、レジストリのCompletionChar/PathCompletionCharの設定が使用されます。
- /V:ON | /V:OFF
- プロンプト起動時の遅延環境変数の展開機能を有効にするかどうかを設定します。指定しない場合はレジストリのDelayedExpansionの設定が使用され、これらも存在しない場合は無効になります(未確認)。
- この機能を有効にすると、「!」文字が使用できるようになります。
- 遅延環境変数の展開機能はバッチファイル内のSetlocalコマンドで動的に変更することもでき、このコマンドによる設定が優先されます(ただしプロンプト上ではSetlocalで変更しても効果がありません)。
- /S
- <command> におけるダブルクオーテーションマーク「" "」の扱いを変更します。詳しくは「解説」をご覧ください。
- /C <command>
- <command> で指定した内容を実行します。実行をした後、「このコマンドを実行したcmd.exe」は終了します。/K スイッチと比較してください。
- /C (または /K) の後に続く文字列はスペースも含めてすべてコマンドラインと見なされるため、cmd.exe に他のオプションを指定する場合は /C (または /K)を必ず最後に指定します。
- なお、「/R」は「/C」と同じ意味を持ちます。
- /K <command>
- <command> で指定した内容を実行します。実行をした後、「このコマンドを実行したcmd.exe」は終了せず、引き続きプロンプトを表示します。Windows上でバッチ ファイルのショートカットを作成する際、cmd.exe /K を使用すると「バッチ ファイルの実行」→「コマンド プロンプト」を連続で行えます。これは、特定の環境(常駐プログラムや環境変数など)でコマンド プロンプトを表示させたい時に便利です。
解説
Windows NT系におけるプロンプトを制御するプログラムであり、Windows NT系においてバッチファイルを実行すると、明示的に指定した場合を除いてCommand.comではなくCmd.exeがバッチファイルの解析を行います。
「Cmd」の使い方・明示的な利用
冒頭に記載の通り、「cmd」をプログラムとして実行するとコマンドプロンプトが実行されます。しかし既にコマンドプロンプトを起動しておりそこからコマンドを実行したい場合や、バッチファイルを直接実行する場合は、「Cmd」を明示的に利用する必要はありません。ただし以下の場合、「Cmd」を明示的に利用する必要があります。
- 新しいコマンドプロンプト環境を実行する場合・別ウィンドウを開きたい場合
- 「/U」や「/D」「/E」「/F」「/V」を用い、それらの設定が行われた状態のプロンプト環境を利用したい場合
- 多くの場合レジストリ設定の変更やSetlocalコマンドの利用(バッチファイル内のみ)で賄える場合があります。
- コマンドプロンプト以外の環境からバッチファイルを実行し、実行が完了した状態の環境でそのままコマンドプロンプトを利用したい場合
- 「/K」スイッチを用いてバッチファイルを実行することで実現できます。
- 内部コマンドをコマンドプロンプト/バッチファイル以外から実行したい場合
- Mklinkなどの内部コマンドは cmd.exe 自身が解釈する必要があるため、「cmd /C <command>」と実行する必要があります。
- 親バッチファイル内から子バッチファイルを実行する際、子バッチファイルの処理結果(状態)を親と切り離したい場合
- バッチファイルを明示的に「cmd /C」で実行することで可能です。ただしほとんどの場合Setlocalコマンド(およびEndlocalコマンド)で十分である可能性があります。
cmd /C の使い方
「cmd /C」はコマンドを実行するために用いる形式で、「cmd /C echo hello
」のように「cmd /C」に続けてコマンドラインを指定することで実行します。
コマンドプロンプト内やバッチファイル内から実行する場合は通常「cmd /C」を使う必要はありませんが、
- コマンドプロンプト外からコマンドプロンプトの内部コマンドを実行する場合
- バッチファイルの処理を独立した環境で実行したい場合
には「cmd /C」を使う必要があります。
似たオプションに「cmd /K」が存在します。「cmd /K」は「コマンドを実行した後、引き続きコマンドプロンプトを表示する」という効果があり、主に「バッチファイルで環境変数を設定した後、その環境下でコマンドプロンプトを表示する」といった用途で使われます(サンプルも参照)。
「cmd /C」および「cmd /K」の後ろに指定するコマンドラインはダブルクオーテーションマーク「" "」で括ることができますが、実行時にダブルクオーテーションマークが取り除かれるかどうかはその使い方、および「/S」オプションがあるかどうかに依存します。詳しくは後述の「引用符と /S スイッチ」をご覧ください。
区切り文字とコマンドライン
/C や /K で指定するコマンドラインにリダイレクション「<」・「>」・「>>」やパイプ「|」、および2つのコマンドを区切る「&」・「&&」・「||」が含まれていた場合、コマンドプロンプトやバッチファイル上でそれらを用いた場合と同様に解釈されます。プロンプトやバッチファイル上からこれらの文字を含んだ「cmd.exe」実行を行おうとすると親プロンプト/バッチファイルによって解釈されてしまうため、その場合はコマンドライン(<command>)箇所を「" "」で括るか「^」文字を利用して回避します。なお、「" "」で括った場合は後述の内容にも注意する必要があります。
引用符と /S スイッチ
/C や /K で指定するコマンドラインにダブルクオーテーションマーク(引用符)「" "」がある場合、条件によって2通りの解釈を用います。
- 先頭にダブルクオーテーションマークがあれば取り除き、取り除いた場合最も後ろにあるダブルクオーテーションマークがあればそれも取り除く(残りはそのまま)
- ダブルクオーテーションマークをそのまま(取り除かずに)コマンドラインとして用いる
後者の解釈が採用されるのは以下の条件にすべて当てはまる場合になります。
- /S スイッチがない
- 「" "」のセットが1つだけ(「"」文字が2つだけ)である
- 「" "」の中にスペース文字がある
- 「" "」の中に特殊文字「&<>()@^|」が存在しない
- 「" "」の中の文字列が実在する実行可能ファイルである
※ ここでの「特殊文字」のうち「()@」の3文字はファイル名として使用できるため、それらがファイル名に含まれる場合はご注意ください。
どちらの解釈が採用されるかの具体例は以下の通りです。(簡単のため「/C」スイッチを用いています。)
- cmd /c echo hello
- 解釈1 を利用
- 実際に実行されるコマンド: 「echo hello」
- cmd /c "echo hello"
- 解釈1 を利用(「echo hello」というプログラムが存在しない場合)
- 実際に実行されるコマンド: 「echo hello」(「" "」が取り除かれる)
- cmd /c echo "hello"
- 解釈1 または 解釈2 を利用(「"」が先頭ではないのでどちらも変わりません)
- 実際に実行されるコマンド: 「echo "hello"」(「"」は先頭ではないので取り除かれない)
- cmd /c "app.exe" some parameter
- 解釈1を利用(「" "」の中にスペースが無いため)
- 実際に実行されるコマンド: 「app.exe some parameter」(「" "」が取り除かれる)
- cmd /c ""app.exe" some parameter"
- 解釈1を利用(「"」文字が2つではないため)
- 実際に実行されるコマンド: 「"app.exe" some parameter」(先頭と最後(末尾)の「"」が取り除かれる)
- cmd /c "C:\Program Files\Windows NT\accessories\wordpad.exe" hello.txt
- 解釈2 を利用(「C:\Program Files\Windows NT\accessories\wordpad.exe」が存在する場合)
- 実際に実行されるコマンド: 「"C:\Program Files\Windows NT\accessories\wordpad.exe" hello.txt」
- cmd /s /c "C:\Program Files\Windows NT\accessories\wordpad.exe" hello.txt
- 解釈1 を利用(/S があるため)
- 実際に実行されるコマンド: 「C:\Program Files\Windows NT\accessories\wordpad.exe hello.txt」(先頭と最後(末尾ではない)の「"」が取り除かれ、結果「C:\Program」というプログラムを実行しようとする)
- cmd /c "C:\Program Files\Windows NT\accessories\wordpad.exe" "hello world.txt"
- 解釈1 を利用(「"」の文字数が2つではないため)
- 実際に実行されるコマンド: 「C:\Program Files\Windows NT\accessories\wordpad.exe" "hello world.txt」(先頭と最後の「"」が取り除かれる)
- cmd /c "D:\Our Programs\SomeApp@v1.exe" data.xml
- 解釈1 を利用(「@」文字があるため)
- 実際に実行されるコマンド: 「D:\Our Programs\SomeApp@v1.exe data.xml」(先頭と最後(途中)の「"」が取り除かれるため、結果「D:\Our」というプログラムを実行しようとする)
- cmd /c ""D:\Our Programs\SomeApp@v1.exe" data.xml"
- 解釈1 を利用
- 実際に実行されるコマンド: 「"D:\Our Programs\SomeApp@v1.exe" data.xml」(先頭と最後の「"」が取り除かれるが、結果「D:\Our Programs\SomeApp@v1.exe」というプログラムを実行しようとする)
- cmd /c ""D:\Our Programs\SomeApp@v1.exe" data.xml
- 解釈1 を利用
- 実際に実行されるコマンド: 「"D:\Our Programs\SomeApp@v1.exe data.xml」(先頭と最後(途中)の「"」が取り除かれるため、結果「D:\Our Programs\SomeApp@v1.exe data.xml」というプログラムを実行しようとする)
常に意図した解釈でコマンドラインが実行されるようにしたい場合は、常に「/S」スイッチを用いつつ、コマンドライン(<command>)の最初と最後に(場合によっては余分に)「" "」を付加して括るのが良いと考えられます。
例
サンプル1
cmd /S /C "mklink /S foo bar"
[Windows Vista以降] Mklink コマンドを実行します。Mklink コマンドは内部コマンドであるため、コマンドプロンプト外から実行する場合は必ず「cmd /c」で実行する必要があります。
サンプル2
cmd /K D:\node\bin\nodevars.bat
「D:\node\bin\nodevars.bat」を実行し、引き続きプロンプトを表示します。特定の環境変数がセットされた状態でコマンドプロンプトを実行したい場合に便利です。