Windowsの環境変数「PATH」
初めに
PATHについての説明はいくらでも転がっているのですが、(いいことですが)丁寧な説明で長い記事になっているものが多く、読むのが面倒!という人のために「何ができるか」「なぜ必要なのか」を簡潔にまとめます。
それではどうぞ
PATHを通すことでできること
- プログラムを名前だけでどこからでも実行することができる
例:$notepad
-> メモ帳()が起動します
Pathが通ったプログラムを実行するときの内部的な動き
説明
ファイル名だけをコンソールから実行した場合、
登録してあるPATHの直下にある、拡張子にPATHEXTを持つファイルを実行する
という動きになります。 また、PATHやPATHEXTは登録されている順にファイル検索が行われ、最初に一致したものを実行します。(※後で補足します)
確認
試しに、メモ帳(notepad.exe)を起動します。
$notepad
はい、起動しますね。
ちなみにnotepad.exeは二種類の実行ファイルがあります。(私の環境だけ。。?)
$where notepad C:\Windows\System32\notepad.exe C:\Windows\notepad.exe
$where
は検索パターンに一致するファイルの場所を表示するコマンドです。
既定では、現在のディレクトリおよび PATH 環境変数によって指定されたパス内を検索します。
先ほど実行したnotepad.exeはC:\Windows\System32\notepad.exe
の方ですね。
C:\Windows\notepad.exe
を実行するには、フルパスで指定してやるか、C:\Windows\
の直下で$notepad
を実行する必要があります。
そもそもなぜPathが必要なのか?
一つは、冒頭でも書いた通り「ファイル名だけでどこからでも実行できると便利」ということが挙げられます。
そのほかの理由として、考えられるのは、アプリケーションの開発者側が、ユーザのコンピュータのアプリケーションを実行する際にアプリケーションがどこにあるのかを意識しなくてよい、というのもあるような気がしますね。
余談
「コマンドプロンプトから実行できるコマンドは何があるんだろう?」
そんな時に自分の環境でファイル名のみで利用可能なコマンドの一覧を確認したければ、powershellで
foreach ($a in ($env:PATHEXT).Split(";")) {Start-Process -FilePath "cmd" -ArgumentList " /c where *$a >> %userprofile%\Downloads\command.txt" -Wait }
を実行すると、%userprofile%\Downloads\command.txt
に使用可能なコマンドの一覧が出力されます。
※正確には、上記で出力できるのは外部コマンドと呼ばれる類のものです。cmd.exeには組み込みコマンドというものもあり、組み込みコマンドはコマンドプロンプトでhelp
と打てば全量が表示されます。