Experience Prototypistのマルチリンガル子育て+プログラミングブログ

Design Thinking、語学(英語、中国語、韓国語)、日中マルチリンガル育児、littleBitsやRaspberry Pi, Arduinoを使ったExperience Prototypingネタ。

環境変数が展開されない


これまで動作していたアプリケーションやコマンドがある日、突然動作しなくなってしまう原因として、(ごく稀にではあるが)PATHなどの環境変数中において、「%環境変数名%」の形式で埋め込まれた環境変数が展開されなくなってしまうことがある。

たとえば、java.exeやjavac.exeをコマンドラインから利用するために、環境変数JAVA_HOMEにJDKのインストール先ディレクトリを設定した上で、環境変数PATHの先頭に%JAVA_HOME%\bin;(その他の設定を付加したときのことを考えてみよう。この場合、コマンドプロンプトを開いて、PATHと入力したときに、


PATH=C:\jdk1.4\bin;(その他のパス)

のように、%JAVA_HOME%が環境変数JAVA_HOMEの内容に置換されていれば問題ないのだが、恐ろしいことに、


PATH=%JAVA_HOME%\bin;(その他のパス)

のように出力されてしまうことがある。JAVA_HOMEくらいなら大したことはないのだが、環境変数SystemRootも展開されなかったりすると、標準コマンドさえ使用不能になってしまう。

さて、どうしてこのように環境変数中の環境変数が展開されなくなってしまうのかといえば、(おそらく)環境変数を新規設定、あるいは更新するようなアプリケーション(多くの場合、アプリケーションのインストーラ)が、環境変数を設定、更新する際、レジストリ中の該当環境変数をREG_EXPAND_SZ型としてではなく、REG_SZ型として設定してしまうことにある(ようである、多分。ただし、これが100%原因なのかどうかは自信がない)。

レジストリエディタ(regedt32の方。regeditではだめ)を起動して、レジストリキー\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environmentを開き、問題となっている環境変数(たとえばPATH)がREG_EXPAND_SZ型としてではなく、REG_SZ型として格納されているのであれば、一旦、当該環境変数に対応するレジストリ値をリネームしておき(たとえば、PATH_BAK)、編集→値の追加で再度、当該環境変数に対応するレジストリ値を生成する。この際、データ型にはREG_EXPAND_SZを指定する。生成したレジストリ値を開き、リネームしておいたレジストリ値に格納されている文字列を設定する(リネームしておいたレジストリ値は削除すればよい)。

あとは、システムを再起動し、コマンドプロンプトから環境変数の値を参照して、埋め込まれた環境変数の値が正しく展開されているかどうか、確認していただきたい。

(蛇足ではあるが、ここに紹介した操作によって、システムが不安定になる等の問題が発生したとしても、自己責任でお願いしたい)