Windows で環境変数 PATH をいじる方法のまとめ

Windows で環境変数 PATH をいじる必要があったのですが、コントロールパネルからだといじりづらいです。何とかならないかと調べてみたことをまとめました。

# 環境変数 PATH の中身を見る

## コントロールパネルから見る
Windows 7/8 の場合は、非常に見辛いのでおすすめしません。

Windows 7/8 の画面：

![windows_path_from_controlpanel.jpg](https://qiita-image-store.s3.amazonaws.com/0/191170/db517a32-5359-7157-60e8-bb3b6ae8ec62.jpeg)

しかし Windows 10 では画面が刷新され、比較的使いやすくなっています。

Windows 10 の画面：

![add_to_path_3_win10.jpg](https://qiita-image-store.s3.amazonaws.com/0/191170/59958023-8e01-f60b-d495-545dfcfc9509.jpeg)

画面を開くまでの手順は以下のとおりです。

- 手順
  - Windows キー + Pause/Break キー(またはコントロールパネル > システム)
  - [システムの詳細設定]リンク
  - [詳細設定]タブ
  - [環境変数]ボタン
  - [システム環境変数]グループボックス内の「Path」を選択して [編集]ボタン

## コマンドプロンプトから見る
一行で出しやがるので見辛いです。

```terminal
$ echo %path%
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;...(中略)...;D:\bin1\Python27;D:\bin1\Python27\Scripts;D:\bin1\MinGW\bin;C:\Program Files\Git\bin 
```

工夫すれば少しは見易い(以下は `;` を ` / ` に置換してます)です。

```terminal
$ echo %path:;= / %
C:\Windows\system32 / C:\Windows / C:\Windows\System32\Wbem;...(中略)... / D:\bin1\Python27 / D:\bin1\Python27\Scripts / D:\bin1\MinGW\bin / C:\Program Files\Git\bin 
```

## スクリプトで見る
スクリプトを書けば見易く表示できます。色んな方法があるでしょうが、ここでは Python を例にして、改行区切りで表示するワンライナーを示します。

```terminal
$ python -c "import os; print('\n'.join(os.environ['PATH'].split(';')))"
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
(中略)
D:\bin1\Python27
D:\bin1\Python27\Scripts
D:\bin1\MinGW\bin
C:\Program Files\Git\bin
```

だいぶ見易いですが、スクリプトの実行環境が必要なのが微妙ですね。

## ツールで見る
[Rapid Environment Editor](https://www.rapidee.com/) という便利ツールがあります。

![windows_path_rapidee.jpg](https://qiita-image-store.s3.amazonaws.com/0/191170/e801af8a-6232-7f51-3135-78f46f594e49.jpeg)

環境変数をツリービューで表示して、そこから右クリックメニューを出したり、F2で名前変えたり、という操作感でいじれます。画像には示してませんが、無効なパスを赤文字で表示する親切機能付き。（特に Windows 7/8 の）コントロールパネルより100倍使いやすいです。

# 環境変数 PATH を編集する
次は PATH を編集する方法です。以下の方法があります。

- コントロールパネル > システム
- Rapid Environment Editor
- set/setx コマンド

GUI については既に取り上げたので割愛して、ここでは set/setx コマンドを取り上げます。

## set で PATH を編集する
set コマンドを使うと、コマンドプロンプト上から、あるいはバッチファイルやその他スクリプトの中から PATH を変更できます。

変更の影響範囲は（ややこしいのですがざっくり書くと） **今開いているシェル（コマンドプロンプト）やプログラム** および **そこから起動したシェルやプログラム** のみです。なので最悪 PATH の設定をミスっても、今起動してるコマンドプロンプトを閉じれば済みます。ちなみにバッチファイルについては `setlocal` コマンドを呼び出すことで **影響範囲をそのバッチファイル内のみに絞る** ことも可能だったりします。

……少し話が逸れたので戻ります。set による変更方法は三種類あると思っています。以下では C:\HogeHoge を PATH に追加する場合を例にします。

### 方法1: 末尾に追記する

```terminal
$ set PATH=%PATH%;C:\HogeHoge
```

PATH の値を「現在の PATH」 + C:\HogeHoge にする、という命令になります。一番書きやすく、かつ無難な方法だと思います。

### 方法2: 先頭に追記する

```terminal
$ set PATH=C:\HogeHoge;%PATH%
```

方法1は末尾に追加していましたが、方法2では先頭に追加してます。

方法1との違いは **C:\HogeHoge が、既存のどの PATH（に追加されているディレクトリ）よりも優先される** ということです。PATH の通ったファイル名に対する挙動を上書きしたい場合などに重宝します。

### 方法3: 全部自分で定義する

```terminal
$ set PATH=C:\HogeHoge;C:\fuga;...
```

方法3は現在の PATH を破棄して、全てを自分で定義しちゃうやり方です。

ただし方法3で自分のパスのみを指定しちゃうと、**Windows の動作に必要なデフォの設定(C:\Windows とか C:\Windows\System32 とか)も消えちゃう** ので、一工夫必要でしょう。方法3はその辺がわかっている上級者向けのやり方だと思います。

## setx で PATH を編集する
set の次は setx についてですが、**setx は基本的に使わない方が良いです。**

setx はグローバルの設定を書き換えるため、もし誤った設定を書いちゃった時が大変です。（やったことないので想像ですが）もし仮に Windows のデフォの設定を消しちゃった場合、今動いてる Windows の動作がおかしくなるかもしれません。

とはいえ、グローバルの設定を GUI ではなくコマンドで書き換えたい場合は setx を使うしかないので、どうしても使いたい場合は慎重に使いましょう。

# まとめ
- GUI から閲覧、設定するなら [Rapid Environment Editor](https://www.rapidee.com/)
  - Windows 10 ならコントロールパネルからでも使いやすいので無理に導入する必要はないでしょう
- コマンドで見たいなら `echo %path%`、見易くしたいなら変数置換を使うか、スクリプトで頑張りましょう
- コマンドで一時的に設定（今開いてるコマンドプロンプト上でのみ有効）したいなら set コマンドで
- コマンドでグローバルに設定したいなら setx コマンドで。だけどミスったらやばいので慎重に