環境変数 "PATH" での指定が多すぎるので困った - 「遅延環境変数の展開」を利用した問題の解決

開発するとなると、いろんなアプリを駆使してガリゴリ作業していく事になります。 ネットから小物ツールを拾ってきて、コンソール開いてコマンド叩いて…と。

で、ココで困るのが "path\to\bin_dir" への 環境変数 PATH 指定なんですよ。 頻繁に使うツールだと、一々フルパスを打つのは明らかに効率が悪い為に PATH を通しますが、量が多くなってくると大変なんですよね。 何がって…


http://ir9.jp/hd/hd060822_00.png

環境変数の登録/管理が!



いや、お尻に繋げていけば良いといえば良いのですが…長くなりすぎると、今度は管理が出来なくなってきます。 もう、何が PATH に指定されているのかさっぱりわからない。(この登録用のインターフェースが悪いだけな気もしますけどー)

というわけで、コンソールでコマンド叩くようなアプリへの PATH は、コンソール起動時に読み込んでしまおうと試みる事にしました。「Visual Studio 2005 コマンドプロンプト」みたいな感じですね。




さて、環境変数をどんなアプローチで登録するかとちょっと悩んでみたのですが、間違っても 起動時に読み込むバッチファイルに


set path=%PATH%;c:\kanaria\bin;c:\shink\bin;c:\manna\misya\bin

なんて書いた物を利用する方法は取りたくない。結局何が登録されているのか見づらい状況が変わらないじゃないかと!

というわけで、次のようなアプローチを採ってみる事にしたのです。 …が…

for を利用する。

追加登録したい環境変数一覧を記述したテキストファイルを用意して、それを for で回して登録していこうというアプローチを採ってみました。

追加登録したいパスの一覧を記述したファイル
c:\kanaria\bin
c:\shink\bin
c:\manna\misya\bin
コマンドプロンプト起動時に読み込むバッチファイル

@rem 初めにVS2005用の環境を読み込んでしまう。
@call vs2005_path\sdkvars.bat
@rem 追加のパスを1行ずつ登録
for /f %%p in (path_list.txt) do @set PATH=%PATH%;%%p

for で1行ずつ読み込まれて追加されていく訳だから、これで問題ないだろうー!

…と思ったのですが、どうもおかしい。追加のパスが上手く登録されていないのですよ。PATHの状況を見ると


C:\WINNT>path
PATH=C:\VStudi(略)INNT;C:\WINNT\System32\Wbem;c:\manna\misya\bin

なんか、追加登録したいパスリストの一番最後しか登録されていないんですよ。えええなんで!?

@set PATH=%PATH%;%%p

をぐるぐる for で回しているってことは、この行が呼び出される事に PATH が更新されるってことじゃないんかいな? …なぜ?



この謎の挙動について調べてみた結果、環境変数を取り出す %〜% という書式は、その行を読み取った時のみ評価される らしいんですね。上記の例だと、次のように展開されている模様です。

// 1. コマンドを打って Enter を打つ
for /f %p in (path_list.txt) do @set PATH=%PATH%;%p

// 2. %〜% を展開
for /f %p in (path_list.txt) do @set PATH=C:\VStudi(略)INNT;C:\WINNT\System32\Wbem;%p

// 3. で、for文実行
// %PATH% が定数になったものがぐるぐる回るだけなので
// 結果、最後のpath_listしか登録されない。

これじゃ上手くいかないのは当然ですね。 … for じゃ上手くいかないのか…ッ!?

問題の解決 「遅延環境変数の展開」

えええ、この for で登録していくアプローチはダメなん!? とかちょっと焦りましたが…ありました。良い方法がありました。「遅延環境変数の展開」というものです。

%〜% だと定数として展開されてしまいましたが、!〜! で囲ってあげるとその時の環境変数値を利用してくれるようです

つまり、この例だと


@rem 初めにVS2005用の環境を読み込んでしまう。
@call vs2005_path\sdkvars.bat
@rem 追加のパスを1行ずつ登録
for /f %%p in (path_list.txt) do @set PATH=!PATH!;%%p

とすれば目的の動作をしてくれるようになります。うむよろしい。

ただ、コマンドプロンプトのデフォルトでは、この !〜! の構文を受け付けてくれません。起動オプションとして /v:on をつける必要があります。 一見めんどくさそうですけど、ショートカットのプロパティ開いて 6バイト*1追記するだけですね。

まとめ - ということで

を1つずつ用意し、新しいショートカットに

  • cmd /v:on /k append_path.bat

と書いてあげれば、そのコマンドプロンプトに勝手にパスが追加登録されるようになりました。


システム全体には PATH 増えずに、使うときだけ自動的に PATH が増えるような感じになったので、個人的には満足してます。

また、環境変数一覧がファイルに記述されている状態になりますから、システムドライブ以外に追加のコマンドを配置しておけば、再インストール後ちょっと設定すれば元環境に戻せるってのも良い感じかと思っています。



…しかしまー、なんだこの長ったらしい文章は。^^;

*1:スペース入れたほうが気持ちよいですからなー:ぉ