Windowsのコマンドプロンプトを劇的に使いやすくする3つのハック

　私は自宅での作業時は主にWindowsデスクトップを、外出時はMacBookを使っている。で、WindowsでのCUIツールは一時期PowerShellを使っていたのだが、PowerShellはちょいと重いしコマンドがクセがあり過ぎて使いづらかったので、結局使い慣れたコマンドプロンプトに戻った。
　なお、Windows用のGit Bashである[Git for Windows](https://gitforwindows.org/)をインストールすると、コマンドプロンプト上でもLinuxと同等のコマンドが使えるようになる（インストール時に「optional Unix tools」を有効にする必要がある）ので、それでWindowsだろうがMacだろうが、マシンを跨いでも同じUnix系コマンドでターミナル上の操作を統一できるようになる。
　しかし、そこまでしてもWindowsのコマンドプロンプトには不満が……

1. よく使うコマンドとかをエイリアスに登録したい
1. そのエイリアスはコマンドプロンプト起動時にオートロードさせたい
1. コマンドプロンプトを管理者権限で開くと、毎回確認ダイアログが表示されてうざったい

　まぁ、 3. とかは許容できる人もいるだろうから、これらの不満には個人差もあるとは思うが、上記の不満をすべて解決してみたところ、私のWindowsマシンでのコマンドプロンプト作業がとても快適になった。
　そんなわけで、もしそう遠くない時期にWindowsマシンを買い換えるとして、その時にも参照できるように手順を残しておくことにした次第だ。

## コマンドプロンプトでよく使うコマンドをエイリアスとして登録する

　例えば、`ll`コマンドで`ls -la`したいとか、`..`で`cd ..`したいとか、`go`で`cd (作業ディレクトリ) & clear & git status`したいとか……よく使うコマンドをショートハンドなエイリアスとして登録しておきたいケースは多い。Macのターミナルなら、デフォルトでbashが使えるので`~/.bashrc`に自由にエイリアスを登録できるので問題ないが、コマンドプロンプトではやり方が異なる。コマンドプロンプトでは、エイリアス的なカスタムコマンド（公式にはマクロと呼ばれるのだが、本記事ではエイリアスで統一する）を登録するためのコマンドとして`doskey`が準備されている。これを使ってエイリアスを登録していくことになる。
　まず、コマンドプロンプトを開いたら、

```bash
doskey ll=ls -la
doskey go=cd c:\xampp\htdocs $t cls $t ls -la $t git status
doskey ..=cd ..
doskey ...=cd ../..
doskey ~=cd %USERPROFILE%
doskey myc=mysql -u root -ppasswd -P 33060
doskey wp=php %USERPROFILE%\wp-cli.phar $*
```

　──のようにエイリアスを登録していく。なお、上記の例ではすでにGit for Windowsのoptional Unix toolsを有効化しているので、コマンドプロンプトでUnixコマンドが使えるようになっている前提だ。もしUnixコマンドが使えない場合は`doskey ls=dir`のように登録していくことになるだろう。
　注意点としては、複数のコマンド等を連結するための連結子はエンティティ化しなければならないことだ。コマンドラインでよく使う連結子のエンティティ記法は下記のようになっている。

| エンティティ | 連結子（記号） | 用途・説明 |
|:-----------:|:-------------:|:-----|
| <code>$b</code> | <code>&#124;</code> | <code>{コマンド1} &#124; {コマンド2}</code> はコマンド1の実行結果を受け取ってコマンド2を実行する |
| <code>$b$b</code> | <code>&#124;&#124;</code> | <code>{コマンド1} &#124;&#124; {コマンド2}</code> はコマンド1が異常終了した場合にコマンド2を実行する |
| <code>$g</code> | <code>&#062;</code> | コマンドの標準出力を出力用ファイル等へリダイレクションする（上書き型） |
| <code>$g$g</code> | <code>&#062;&#062;</code> | コマンドの標準出力を出力用ファイル等へリダイレクションする（追記型） |
| <code>$l</code> | <code>&#060;</code> | 外部ファイル等の標準入力によってコマンドを実行するリダイレクション |
| <code>$t</code> | <code>&#038;</code> | <code>{コマンド1} &#038; {コマンド2}</code> はコマンド1とコマンド2が実行される（※厳密には非同期実行のため実行順は保証されないが、大抵はコマンド1→コマンド2の順で実行される） |
| <code>$t$t</code> | <code>&#038;&#038;</code> | <code>{コマンド1} &#038;&#038; {コマンド2}</code> はコマンド1が正常終了後にのみコマンド2を実行 |
| <code>$$</code> | <code>&#036;</code> | 文字列$をコマンドライン上で使う際のエスケープ |
| <code>$*</code> | <code>&#036;*</code> | エイリアス化したコマンドに引数を追加して使いたい場合に使う。いくらでも引数を受け入れられるように<code>&#036;*</code>としておくのが便利 |

　そして、登録したエイリアスの一覧は、

```bash
doskey /macros
```

　──で確認できる。

　だが、ここで登録したエイリアスはコマンドプロンプトを閉じると失われてしまう。次回起動時も再利用するためには、外部ファイルに書き出して、都度読み出す必要がある。詳しくは次項で説明する。

## 登録したエイリアスをコマンドプロンプト起動時にオートロードさせる

　せっかく登録したエイリアスも、デフォルトではコマンドプロンプトを閉じてしまうと失われてしまう。そこで、登録したエイリアスは外部ファイルに保存しておき、再利用可能にしておく必要がある。まず、エイリアスリストをファイルに出力しよう。

```bash
doskey /macros > %USERPROFILE%\macros.txt
```

　`%USERPPROFILE%`はWindowsの環境変数で、現在ログインしているユーザーのホームディレクトリのパス（`C:\Users\{UserName}`）となる。あとはコマンドプロンプトを起動する時にこのエイリアスリストファイルを読み込んであげればよい。
　それには、コマンドプロンプトへのショートカットを作成して、その起動コマンドにエイリアスを読み込むオプションを追加してやればOKだ。

　デスクトップにコマンドプロンプトのショートカットを作るには、まずエクスプローラを開いてアドレス欄に`C:\WINDOWS\system32`と入力する。そして隣の検索欄に`cmd`と入力して検索すると、検索結果リストに`cmd.exe`のファイルが表示されるので、右クリックして「送る」から「デスクトップ（ショートカットを作成）」を実行する。
　これで、デスクトップに『cmd.exe - ショートカット』というショートカットが作成されているので、このショートカットを右クリックして「プロパティ」を開く。

![cmd_shortcut_props.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64077/11a716ec-5993-9fa5-2564-dd9091a8c904.png)

　ショートカットタブの「リンク先」のフィールドを下記のように書き換えて適用する。

```text
C:\Windows\System32\cmd.exe /k "doskey /macrofile=%USERPROFILE%\macros.txt"
```

 これで完了だ。このショートカットからコマンドプロンプトを起動して、`doskey \macros`を実行すれば、登録したエイリアスが読み込まれていることが確認できるはずだ。

## コマンドプロンプトを管理者権限で開いた時の確認ダイアログをスキップさせる

　私の場合、コマンドプロンプトでの作業時に管理者権限を求められるケースがしばしばある。例えば、`ln -s`でシンボリックリンクを作成する必要があったりする場合などだ。コマンドプロンプトではUnix系コマンドラインのように`sudo`や`su`で一時的に管理者権限でコマンドを実行するということができないので、そういう時はいちいち新たに管理者権限でコマンドプロンプトを開いて……みたいな運用が必要になってしまう。これはさすがに面倒なので、毎度コマンドプロンプトは管理者権限で開くようにしている。
　しかし、Windowsでは管理者権限でアプリケーションを開こうとすると、

![win_uac_prompt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64077/91c9d0a7-c23b-bfd4-8b30-97099f8d454b.png)

　こういう確認ダイアログ（UACプロンプトと呼ばれる）が表示される。これがうざったいのだ（笑）
　そこで、管理者権限でコマンドプロンプトを起動する時にこのUACプロンプトを表示しないようにして、さらに登録したエイリアスも読み込むための設定をしていく（何気に、この手順が一番面倒だった）。
　まず、[Windowsキー]＋[R]を押して「ファイル名を指定して実行」ダイアログを開き、入力欄に`taskschd.msc`と入力して「OK」を実行する。これで「**タスク スケジューラ**」が起動するので、タスクスケジューラの右端のペイン「操作」の中にある「タスクの作成」をクリックすると、下記のような「タスクの作成」ウィンドウが開く。

![task_scheduler_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64077/9af5049a-81a8-a4ba-c52c-cd9c97156df7.png)

　「全般」タブではタスクの「名前」を設定し（「説明」は任意でOK）、セキュリティオプションの「最上位の特権で実行する」にチェックを入れ、「構成」のプルダウンから`Windows 10`を選ぶ。
　次に、「操作」タブで「新規」をクリックすると、「新しい操作」ウィンドウが開く（下図参照）。

![task_scheduler_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64077/66397339-f387-43c3-b68d-a554dd7df147.png)

　「プログラム/スクリプト」欄に`cmd.exe`を、「引数の追加（オプション）」欄には、

```text
/c start "Admin_Command_Prompt" "%windir%\System32\cmd.exe" /k "doskey /macrofile=%USERPROFILE%\macros.txt"
```

　──と、それぞれ設定する。注意点としては、引数オプションのタスク名（この例では`"Admin_Command_Prompt"`の部分）は必ずダブルクォーテーションで括ることぐらいだ。 
　あと、もしラップトップマシン等で設定する場合は、「条件」タブの「電源」オプションのチェックを外しておいた方が良い（でないと、電源に接続している時しかこのタスクが有効にならないので）。
　以上でタスク作成は完了なので、「OK」をクリックしてコミットする（タスクスケジューラも閉じてしまって構わない）。

　これで、管理者権限でコマンドプロンプトを起動するタスクができたので、このタスクをショートカットから呼び出せばよい。手っ取り早く、前項で作成したコマンドプロンプト用のショートカットを再利用してしまおう。そのショートカットを右クリックして「プロパティ」を実行し、ショートカットのプロパティウィンドウの「ショートカット」タブの「リンク先」を下記のように置き換えるのだ。

```text
C:\Windows\System32\schtasks.exe /run /tn "Admin_Command_Prompt"
```

　変更をコミットしたら、早速このショートカットからコマンドプロンプトを起動してみよう。UACプロンプトが表示されることもなく、管理者権限でコマンドプロンプトが起動するようになる。もちろん、登録したエイリアスも自動で読み込まれているはずなので、`doskey /macros`で確認してみよう。

## おまけ：ショートカットアイコンをコマンドプロンプトのアイコンに変更する

　UACプロンプト回避版ショートカットに更新すると、ショートカットアイコンがタスクスケジューラのアイコンに変更されてしまう。ショートカットの見た目はコマンドプロンプトのままの方が利便性が良いので、アイコンを変更しよう。
　まず、ショートカットを右クリックして「プロパティ」を実行して、プロパティウィンドウを開いたら、「ショートカット」タブの「アイコンの変更」をクリックする。アイコンの変更ウィンドウが開くので、検索欄に`%SystemRoot%\System32\cmd.exe`と入力してエンターキーを押すと、コマンドプロンプトのアイコンが表示されるので、それを選択してOKすれば完了だ。

![cmd_shortcut_icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64077/36d3a331-3b76-2951-960c-808df1998346.png)

　あと、ショートカット名などは任意に変更して構わない。

- - -

　もし、私と同じような不満がある人はこれらのハックを試してみて欲しい。コマンドプロンプトでの作業が劇的に快適になるはずだ。