それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Windowsのパス(PATH)の読込順 と起動される順番

Windowsのパスは先に書いたモノから読み込まれる。一瞬あとのほうが上書き的な意味で有線かと思ったけど。FIFOだということだ。

衝突が起きるようなPATH

テスト用に次の2ファイルを準備しました。

  'C:\Users\takuya\apps\vim\vim73\vim.exe';
  'C:\Users\takuya\apps\vim\gvim72\vim.exe';

vim/gvim の中に、vim.exeという同名のコマンドが入っています。名前が衝突します。

衝突するようにPATHを設定しました

PATH=C:\Users\takuya\apps\vim\vim73;C:\Users\takuya\apps\vim\gvim72

実行してみました。

C:\Users\takuya>vim

先に見つかったモノから実行されます。この場合は、CUIvimが先に実行されます。

where コマンドで名前の衝突を確認する。

あれ、おかしいな、と思ったら、where コマンドで確認します。

C:\Users\takuya>where vim
C:\Users\takuya\apps\vim\vim73\vim.exe
C:\Users\takuya\apps\vim\gvim72\vim.exe

Findコマンドも、衝突する定番ですね。

C:\Users\takuya>where find
C:\Windows\System32\find.exe
C:\Users\takuya\apps\gnuwin32\bin\find.exe

ほかにも、Python2.6/Python2.7だとかRuby1.8/ruby1.9が衝突の定番ですね

上記の「環境変数PATH」をさらに詳しくいえば、

  1. カレントディレクト
  2. 環境変数 PATH
  3. Registry "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths"
Windows の path 自動検索機能

の順で探されるらしい。
3.は馴染みがないですが。

3.の存在自体初めて知りました。

"excel" と打って実行できるのは 3 のしくみです。

とのことです。僕も知らなかった!!

実際に見てみたら、python.exeがココに定義されていた。Pythonマナーいいね。

PATHはさらに細分化していて
  1. ユーザ環境変数
  2. システム環境変数

に分割されて管理されている。

それぞれは、次のレジストリに格納されている。

ユーザー環境変数
HKEY_CURRENT_USER\Environment\Path
システム環境変数
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

レジストリ値なので、レジストリを変更したらログオフ(または再起動)すれば反映される。

再起動せずに反映させる方法

ログオフせずにこれらの変更を有効にするには、関連するアプリケーション (エクスプローラ、プログラム マネージャ、タスク マネージャ、コントロール パネルなど) が更新を行えるように、システム内のすべてのウィンドウに WM_SETTINGCHANGE メッセージをブロードキャストします。

レジストリの値は、再起動せずに反映させる方法がある。いまだに再起動を求めてくるシステムとか信じられないよね。LismoとかリスモとかLISMOとか。日本のシステム開発ベンダってヒドイなって思うわ。共用ライブラリ入れたわけでもないのに再起動求めてくるとかホント意味が分からない。

環境変数の上書き

環境変数は、システム環境変数をユーザー環境変数で上書きできるのですが、PATHだけはなぜか上書きされない。僕はPATHを上書き(優先度を変更)したいのですが・・・やり方が分かりません

Autorunを使う。

コマンドプロンプトは、実行時に自動実行されるプログラムを指定できる(非Autoexec.bat)
次のレジストリ

HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun\REG_EXPAND_SZ
実行したいプログラムのパスを書く

ことで実現できるそうだ
msdn-cmd

どうやら固定の可能性が。。。

PATHについては固定の可能性がある。

ユーザー環境変数

ユーザー環境変数もコントロール パネルで同様に表示することができます。ユーザーは、[<ユーザー名>のユーザー環境変数] フィールドで環境変数を追加、削除、または修正することができます。これらの変数は、システム環境変数よりも優先されます。ユーザー パスは、システム パスの後ろに付加されます。

しかしWindowsに限ってそれはないはず。