これは、コマンドプロンプト(cmd.exe) Advent Calendar 2015 - Qiitaの1日目の記事です。
※Windows 10 Home 64bit 搭載のcmd.exeにて検証を行っています。

### cmd /? ``` Windows コマンド インタープリターの新しいインスタンスを開始します。 CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF] [[/S] [/C | /K] 文字列] /C "文字列" に指定されたコマンドを実行した後、終了します。 /K "文字列" に指定されたコマンドを実行しますが、終了しません。 /S /C または /K の後の文字列の扱いを変更します (以下の説明を参照してください)。 /Q エコーをオフにします。 /D レジストリからの AutoRun コマンドの実行を無効にします (下記を参照してください)。 /A 内部コマンドの出力結果を ANSI でパイプまたはファイルに出力します。 /U 内部コマンドの出力結果を Unicode でパイプまたはファイルに出力します。 /T:fg 前景色および背景色を設定します (詳細は COLOR /? を参照してください)。 /E:ON コマンド拡張機能を有効にします (以下の説明を参照してください)。 /E:OFF コマンド拡張機能を無効にします (以下の説明を参照してください)。 /F:ON ファイル名およびディレクトリ名補完文字を有効にします (以下の説明を参照してください)。 /F:OFF ファイルおよびディレクトリ名補完文字を無効にします (以下の説明を参照してください)。 /V:ON 区切り文字として ! を使って遅延環境変数の展開を有効にします。 たとえば、/V:ON とすると、!var! は、実行時に変数 var を展開します。 var 構文は、FOR ループ中とは違い、入力時に変数を展開します。 /V:OFF 遅延環境展開を無効にします。 コマンド セパレーター '&&' で区切られた複数のコマンドが引用符で囲まれている場合 は、"文字列" として指定されます。また互換性の理由から /X と /E:ON、/Y と /E:OFF、および /R と /C は同じです。その他のスイッチは無視されます。 /C または /K が指定されている場合、スイッチの後の残りのコマンド ラインが コマンド ラインとして処理されます。次のルールが引用符 (") の処理に使われます: 1. 次のすべての条件に一致する場合、コマンド ラインの引用符が有効になり ます: - /S スイッチがない - 引用符が 1 組ある - 引用符の中に特殊文字がない (特殊文字は &<>()@^| です) - 引用符の中に 1 つ以上のスペースがある - 引用符の中の文字列が、実行可能ファイルの名前である 2. 最初の文字が引用符であるにも関わらず上の条件に一致しない場合は、最初 の引用符とコマンド ラインの最後の引用符が削除され、最後の引用符の後 のテキストが有効になります。 コマンド ラインで /D が指定されなかった場合は、CMD.EXE の開始時に次の REG_SZ または REG_EXPAND_SZ レジストリ変数が検索されます。次のレジストリ変数の両方 またはどちらかが存在する場合、それらを最初に実行します。 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun および/または HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun 既定では、コマンド拡張機能は有効です。拡張機能を無効にして CMD.EXE を 起動するには、/E:OFF スイッチを使用します。コンピューターまたは ユーザー ログオン セッションで起動される CMD.EXE コマンド すべてに対して拡張機能を有効または無効にするには、REGEDIT.EXE を使って レジストリにある次の REG_DWORD 値を設定します。コンピューターに対しては、 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\EnableExtensions に 0x1 を設定すると有効になり、0x0 を設定すると無効になります。 ログオン セッションに対しては、 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\EnableExtensions に 0x1 を設定すると有効になり、0x0 を設定すると無効になります。 ユーザー固有の設定は、コンピューターの設定より優先されます。 コマンド ライン スイッチは、レジストリの設定より優先されます。 バッチ ファイルでは、SETLOCAL ENABLEEXTENSIONS または DISABLEEXTENSIONS 引数は /E:ON または /E:OFF スイッチよりも優先されます。詳細については SETLOCAL /? を 参照してください。 コマンド拡張機能には、次のコマンドに対する変更または追加が含まれています。 DEL または ERASE COLOR CD または CHDIR MD または MKDIR PROMPT PUSHD POPD SET SETLOCAL ENDLOCAL IF FOR CALL SHIFT GOTO START (外部コマンドの起動の変更を含みます) ASSOC FTYPE 詳細は、コマンド名の後に「/?」と入力すると表示されるヘルプを参照してください。 レジストリにある次の REG_DWORD 値を設定します。コンピューターに対しては、 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\EnableExtensions に 0x1 を設定すると有効になり、0x0 を設定すると無効になります。 ログオン セッションに対しては、 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\EnableExtensions に 0x1 を設定すると有効になり、0x0 を設定すると無効になります。 ユーザー固有の設定は、コンピューターの設定より優先されます。 コマンド ライン スイッチは、レジストリの設定より優先されます。 バッチ ファイルでは、SETLOCAL ENABLEEXTENSIONS または DISABLEEXTENSIONS 引数は /E:ON または /E:OFF スイッチよりも優先されます。詳細については SETLOCAL /? を 参照してください。 コマンド拡張機能には、次のコマンドに対する変更または追加が含まれています。 DEL または ERASE COLOR CD または CHDIR MD または MKDIR PROMPT PUSHD POPD SET SETLOCAL ENDLOCAL IF FOR CALL SHIFT GOTO START (外部コマンドの起動の変更を含みます) ASSOC FTYPE 詳細は、コマンド名の後に「/?」と入力すると表示されるヘルプを参照してください。 既定では、遅延環境変数の展開は有効ではありません。遅延環境変数の展開を有効また は無効にして CMD.EXE を起動するには、/V:ON または /V:OFF スイッチを使います。 コンピューターまたはログオン セッションで起動される CMD.EXE コマンドすべてに対 して遅延の展開を有効または無効にするには、REGEDIT.EXE を使ってレジストリにある 次の REG_DWORD 値を設定します。コンピューターに対しては、 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion に 0x1 を設定すると有効になり、0x0 を設定すると無効になります。 ユーザー ログオン セッションに対しては、 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion に 0x1 を設定すると有効になり、0x0 を設定すると無効になります。 ユーザー固有の設定は、コンピューターの設定より優先されます。 コマンド ライン スイッチは、レジストリの設定より優先されます。 バッチ ファイルでは、SETLOCAL ENABLEEXTENSIONS または DISABLEEXTENSIONS 引数は /V:ON または /V:OFF スイッチよりも優先されます。 詳細については SETLOCAL /? を参照してください。 遅延環境変数の展開が有効になっている場合、感嘆符を使うと実行時に環境変数の 値を置き換えることができます。 CMD.EXE の特定の起動のファイル名補完機能を有効または無効にするには、/F:ON または /F:OFF スイッチを使用します。コンピューターとユーザー ログオン セッション またはそのいずれかで起動される CMD.EXE コマンドすべてに対して補完機能を有効 または無効にするには、REGEDIT.EXE を使ってレジストリにある次の REG_DWORD 値を 設定します。コンピューターに対しては、 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\CompletionChar HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\PathCompletionChar に特定の機能に使う 16 進の制御文字を設定します (例 0x4 は Ctrl-D、0x6 は Ctrl-F)。ユーザー ログオン セッションに対しては、 HKEY_CURRENT_USER\Software\Microsoft\Command Processor\CompletionChar HKEY_CURRENT_USER\Software\Microsoft\Command Processor\PathCompletionChar に特定の機能に使う 16 進の制御文字を指定します (例: 0x4 は Ctrl-D、0x6 は Ctrl-F)。 ユーザー固有の設定は、コンピューターの設定より優先されます。 コマンド ライン スイッチは、レジストリの設定より優先されます。 /F:ON スイッチで補完機能を有効にした場合、2 つの制御文字 (Ctrl-D はディレ クトリ名補完機能、Ctrl-F はファイル名補完機能) が使用されます。 レジストリで特定の補完文字を無効にするには、制御文字として有効でないスペース (0x20) の値を使用します。 2 つの制御文字のどちらかを入力すると、補完機能が起動されます。 パスが存在しない場合、プログラムはカーソルの左側のパス文字列にワイルド カード文字を付加し、一致するパスの一覧を作成します。その後一致する最初の パスを表示します。パスが一致しない場合、音を鳴らします。同じ制御文字を押し 続けると一致するパスの一覧を順に表示します。Shift キーを押しながら制御文字 を押すと一覧を逆回り表示します。行を編集して制御文字をもう一度押すと、保存 されていた一致したパスの一覧は破棄され、新しい一覧が作成されます。 ファイル名補完機能とディレクトリ名補完機能を切り替えたときも同様です。 2 つの制御文字の違いは、ディレクトリ補完文字がディレクトリ名だけを照合する のに対し、ファイル名補完文字はファイルとディレクトリ名の両方を照合する点です。 ファイル補完機能が内部ディレクトリ コマンド (CD、MD または RD) に使用され た場合、ディレクトリ補完機能と見なされます。 一致するパスの前後に引用符を付けると、補完機能コードでスペースまたは他の 特別な文字を含むファイル名が使用できるようになります。また、行の前に戻って 補完機能を起動した場合、補完機能が呼び出された時点でカーソルの右側に あったテキストは破棄されます。 引用符が必要な特別な文字は次のとおりです: <スペース> &()[]{}^=;!'+,`~ ```読みましたか?


……読みましたね?


### よく使うオプション さて、我々が快適なcmd.exeライフを満喫するためにぜひとも読むべき場所は、以下の部分です。 ``` /C "文字列" に指定されたコマンドを実行した後、終了します。 /K "文字列" に指定されたコマンドを実行しますが、終了しません。 ```
#### /C オプション /Cオプションを使うことで、現在のプロセスをforkしてコマンドを実行することができます。
UNIXでいうところのsh -cみたいなものですね。試してみましょう。

```dosbatch set AAA=HOGE cmd /C "set AAA > aaa.txt" cmd /C "set BBB=FUGA" echo AAA=%AAA% echo BBB=%BBB% type aaa.txt ```実行結果 ``` C:\Users\kunst>set AAA=HOGE C:\Users\kunst>cmd /C "set AAA > aaa.txt" C:\Users\kunst>cmd /C "set BBB=FUGA" C:\Users\kunst>echo AAA=%AAA% AAA=HOGE C:\Users\kunst>echo BBB=%BBB% BBB=%BBB% C:\Users\kunst>type aaa.txt AAA=HOGE ```この実行結果より、以下のことがわかります。
  • cmd /C で実行したサブシェル内へは、環境変数は受け継がれる
  • cmd /C で設定された環境変数は、親環境へは影響しない
#### /K オプション UNIXのexecみたいな感じです。やってみましょう。 ```dosbatch set AAA=HOGE cmd /k "set AAA" echo AAA=%AAA% set BBB=FUGA echo BBB=%BBB% exit echo AAA=%AAA% echo BBB=%BBB% ```
実行結果 ``` C:\Users\kunst>set AAA=HOGE C:\Users\kunst>cmd /k "set AAA" AAA=HOGE C:\Users\kunst>echo AAA=%AAA% AAA=HOGE C:\Users\kunst>set BBB=FUGA C:\Users\kunst>echo BBB=%BBB% BBB=FUGA C:\Users\kunst>exit C:\Users\kunst>echo AAA=%AAA% AAA=HOGE C:\Users\kunst>echo BBB=%BBB% BBB=%BBB% ```この実行結果より、以下のことがわかります。
  • cmd /K で実行したサブシェル内へは、環境変数は受け継がれる
  • cmd /K で設定された環境変数は、親環境へは影響しない

/Cオプションのときと同じですが、exitするまで新環境でアレコレできます。/Kオプションの応用としては、例えば ```dosbatch cmd /k "set PATH=%PATH%;%USERPROFILE%\bin" ```などとしてcmd.exeを起動すれば、環境変数の設定を汚さずにPATHを追加した環境で作業したりできます。
諸般の事情で管理者権限がないときに環境変数の設定をいじったりするときによく使います。


……それでは雑ですが、アドベントカレンダー初日はこんな感じで。(続きもいつも通りこんな軽いノリで書いていきます)