cmd.exe基礎

（2019/5/7追記）[Windows Terminal](https://devblogs.microsoft.com/commandline/introducing-windows-terminal/)というものがMSから発表されました！

----

この記事は[Windows & Microsoft技術 基礎 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/ms)の1日目の記事です。

PowerShellについてはこの記事では扱いません([PowerShell Advent Calendar](https://atnd.org/events/72226)をご覧になるとよいと思います)。

cmd.exeの使い方をもっと掘り下げたい方は、[コマンドプロンプト(cmd.exe) Advent Calendar](http://qiita.com/advent-calendar/2015/cmd)もご覧ください。

# 名前
cmd.exeを起動することで動作する対話型コマンドラインインターフェイスソフトウェア（コマンドシェル）の名前は「コマンドプロンプト」、cmd.exeでも使われる例の黒いウィンドウの名前は「コンソール」です。*nixではないので「ターミナル」とか「端末」とは呼びません（実際違います）。

# パス
環境変数 `%COMSPEC%` にcmd.exeのフルパスが入っています。標準的には `C:\WINDOWS\system32\cmd.exe` です。環境変数 `%SYSTEMROOT%` や `%WINDIR%` を用いて `%SYSTEMROOT%\system32\cmd.exe` と書いてもいいでしょう。

なお、64ビットWindowsで32ビット版cmd.exeを呼び出したいときは `C:\Windows\SysWOW64\cmd.exe` を使います。

# 基本設定
起動しているcmd.exeウィンドウのタイトルバーを右クリックすると「プロパティ」というコンテキストメニューが表示されます。それを選択するとcmd.exeで使われるコンソールの全体的な設定ウィンドウが開きます。

![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/2079/22dd9c60-4ae8-576d-dae3-16c0c49d18b1.png)

なお、この設定は、cmd.exeへのショートカットごとに分けることができます。ショートカットを右クリックして「プロパティ」を選択したときはこんな風に表示されます。

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/2079/53837ae6-ca63-d22f-00ce-f8cb866cb977.png)

## Windows 10のコンソール

これまでのWindowsと比較するとちょっとだけ進化しています。「オプション」で「従来のコンソールを使う(再起動が必要)」のチェックを外しておくと、次回起動時から以下の設定が可能になります。

* Ctrl キー ショートカットを有効にする
  * Ctrl+C, Ctrl+V, Ctrl+Aなどが使えるようになる（他にもいくつかのショートカットが有効になる）
* 貼り付け時にクリップボードの内容をフィルターする
  * クリップボードの内容をcmd.exeに張り付けるときに、Tab文字を削除するなどのフィルター処理を行う
* 行の折り返し選択を有効にする
  * 未チェックのときは矩形選択、チェックしたときは行選択がデフォルトになる
  * Altキーを押しながら選択したときは、デフォルトと反対の挙動になる
* テキスト選択キーを拡張する
  * Shift＋矢印キー, Shift+Home, Shift+Endでテキスト選択範囲を変更できる
* サイズ変更時にテキスト出力を折り返す（レイアウト タブ）
  * ウィンドウサイズを変更した時に、テキストが自動的に折り返し表示される
* 不透明度（画面の色 タブ）
  * 100%以下にすることで、cmd.exeの背景が透過する

# コードページ
Windowsは歴史的な理由で、テキストや文字列を扱うとき、ワイド文字列（Unicode、厳密にはUTF-16LE）かANSI文字列（非Unicode）かという区別をすることがあります。そして、ANSI文字列というのが実際にはどの文字エンコーディングなのかを表すのがコードページです。

デフォルトのコードページが何なのかは、システムロケールによって決まります。

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/2079/522ec2a3-8d29-2c10-fc2b-85feecbe2eec.png)

「コントロールパネル」→「地域」→「管理」の「Unicode対応でないプログラムの現在の言語」として選択されているのがシステムロケールです。初期状態は、Windowsをインストールするときに選んだ言語が表示されています。

この画像ではシステムロケールに「日本語（日本）」が設定されています。この場合、デフォルトのコードページは932です。コードページ932では、ANSI文字列のエンコーディングはShift_JIS (厳密にはWindows-31J) と決められています。cmd.exeの文字エンコーディングがShift_JISなのはそういう理由なのです。

cmd.exeのコードページは、`chcp`コマンドで実行中に変更することができます。UTF-8 (BOMなし) にしたい場合は、`chcp 65001`を実行し、コードページを65001に切り替えます。

`chcp` を毎回実行するのが面倒な場合は、cmd.exeのショートカットを作り、プロパティを表示して、リンク先のコマンドに引数として ` /K "chcp 65001"`などと追加することで、そのショートカット経由でcmd.exeを起動するたびに`chcp`を実行させることができます。

![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/2079/18f7b037-e01e-e166-b270-47bee31971ef.png)

（ショートカットを使わない方法として、レジストリにキー `HKCU\Console\%SystemRoot%_system32_cmd.exe` を追加し、その中に `CodePage`の設定を追加するという方法もあるようです。）

# フォント

cmd.exeのデフォルトのフォントもコードページで決定されます。コードページ932の場合はMSゴシックが使われます。コードページ65001の場合はLucida Console（環境によってはConsolas）が使われるのでそのままだと日本語が表示できません。

コンソールの設定でフォントを選択するドロップダウンがあるのですが、通常は「ラスターフォント」か、現在のコードページに紐づいた既定のフォントからしか選択できないはずです。（追記：Windows 10 Anniversary Update (バージョン1607, RS1) でcmd.exeがさらに改善され、TrueTypeフォントの選択肢が広がりました。それでも望みのフォントが選べないときだけ、↓のレジストリ操作をするとよいでしょう。）

このドロップダウンに選択肢を追加するには、レジストリ `HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont` 以下を変更します。ただし、ここに設定してもcmd.exeに反映されないことがあったり、cmd.exeを起動しなおすとドロップダウンの選択肢がデフォルトに戻っていたりと、よくわからない挙動を示すことがあるので、私はこの設定は使いません。

# 環境変数

現在起動しているcmd.exeプロセスの環境変数を変更するには `set`コマンドを使います。ただし、`set`コマンドによる変更は、このプロセスおよび子孫プロセスにしか影響しません。

今後起動するすべてのプロセスの環境変数を変更するには、`setx`コマンドを使うか、「コントロールパネル」→「システム」→「システムの詳細設定の表示」→「環境変数」で設定します。ただし、どちらを使った場合も、現在実行中のcmd.exeプロセスの環境変数は変更されません。

![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/2079/6f146e2e-1538-ee68-7b41-90c6e19e7f4a.png)

# 代替コンソール

注：ここでは、シェル(bash, zsh, nyaosなど)については書きません。

標準のコンソールはフォントの設定が面倒だし、いろいろつらいので、代替コンソールを使ったほうがいろいろ幸せになれると思います。

* ConEmu (https://conemu.github.io/)
  * タブ化できるし、他にも便利な機能があるので、おすすめ
  * いろいろ詰め合わせの cmder (http://cmder.net/) でもOK
* Mintty (https://mintty.github.io/)
  * 単体でインストールしてもいいし、CygwinやMSYS2に同梱されているものでもOK
  * 起動時に `mintty %COMSPEC%` と引数を渡せば、Minttyでcmd.exeを実行できる
* ConsoleZ (https://github.com/cbucher/console)
  * Console2の後継

どれも2015年現在もアクティブに開発が続いているようです。

# おまけ：bashっぽい補完

* Clink (https://mridgers.github.io/clink/)
  * cmd.exeプロセスに介入して、Tabキーによる補完を強力にする