プロが教えるわが家の防犯対策術!

環境変数の中で環境変数を使用したときに、
こちらの思ったように文字列が展開されません。


例.
システム環境変数
SystemDrive=C:
WORK_PATH=%SYSTEMDRIVE%\temp
PATH=%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem

ユーザー環境変数
PATH=%WORK_PATH%;%PATH%

こんな感じでセットされている場合、
コマンドプロンプトでset PATHした場合の結果が異なります。

Vistaでは C:\temp;C:\WINDOWS~ と展開されますが、
Windows XP環境では %SYSTEMDRIVE%\temp;C:\WINDOWS~ と、
%SYSTEMDRIVE%の部分がそのままになってしまいます。

Windowsの環境変数には2種類の属性があり、
上記の環境変数を登録する際は"展開可能"属性にしました。

またレジストリの"Command Processor\EnableExtensions"
も1になっていることを確認しています。

ちなみにset WORK_PATHとしたときは、
両方の環境で C:\temp と表示されることから、
環境変数の再帰展開がうまく機能していないと思われます。

XP環境でもVista環境と同じように環境変数の再帰展開をすることは可能でしょうか?

A 回答 (2件)

補足によると、「ユーザー環境変数側に設定した」とのことなので、改めて、検証してみました。



システム側、またはシステム側&ユーザー側両方に、
Work_Path=%SystemDrive%\Temp
を設定した場合には、
Path=C:\Temp;C:\WINDOWS\system32;C:\WINDOWS・・・・
と正常に展開されます。
ユーザー側にのみ設定した場合には、
Path=%Work_Path%;C:\WINDOWS\system32;C:\WINDOWS・・・・
と展開されない形で表示されました。
しかし、私の環境でユーザー環境変数同士で正常に展開されているものがあるので、「ひょっとしてアルファベット順?」と、
Pass=%SystemDrive%\Temp
Path=%Pass%;%Path%;
を設定してみた所、
Path=C:\Temp;C:\WINDOWS\system32;C:\WINDOWS・・・・
と正常に展開されました。
どうやら、ユーザー環境変数同士の場合、
アルファベット順に展開していって、展開できないものはそのまま
ということなのではないでしょうか?
Vista環境が無いので確認できませんが、Vistaでユーザー環境同士の展開が正常に行われるとしたら、すべての展開が終わるまでループさせているのではないかと思います。
    • good
    • 0
この回答へのお礼

環境変数の展開の順番は、
システム環境変数 -> ユーザー環境変数で
それぞれアルファベット順に行っているようですね。
非常に勉強になりました。

展開順を考慮して変数を定義することにします。

ちょっと検索してみたのですが、ネット上に全然情報がないことに驚きました。

お礼日時:2009/09/12 00:00

今、手元にXP環境が無いので、2000 ServerとServer 2003で確認しましたが、ご質問のような再帰展開の不具合は発生しませんでした。



ご質問のように「コマンドプロンプト」で
Set Path
を実行しても、システム環境変数側の設定が表示されるのみで、ユーザー環境変数側の設定は表示されませんので、ユーザー環境変数側を
UserPath=%Work_Path%;%Path%
として実行してみました。
その結果、まず、システム環境変数側に設定した
Work_Path=%SystemDrive%\Temp
が、"再起動後"でないと「コマンドプロンプト」上に表示されませんでした。(『システムのプロパティ』のシステム環境変数の一覧には表示されませんが、"SystemDrive=C:"は元々、システムインストール時に自動的に設定されているので表示されます。)
再起動後の「コマンドプロンプト」上では、正常に、
UserPath=C:\Temp;C:\WINDOWS\system32;C:\WINDOWS;・・・・
と再起展開されました。

>またレジストリの"Command Processor\EnableExtensions"も1になっていることを確認しています。

レジストリに同じ"EnableExtensions"が複数箇所あるのをご存知でしょうか?
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor
EnableExtensions  REG_DWORD  0x00000001
HKEY_CURRENT_USER\Software\Microsoft\Command Processor
EnableExtensions  REG_DWORD  0x00000001

両方の設定が異なる場合には、ユーザー側の設定が優先されます。

この回答への補足

>今、手元にXP環境が無いので、2000 ServerとServer 2003で確認しましたが、ご質問のような再帰展開の不具合は発生しませんでした。
>
>ご質問のように「コマンドプロンプト」で
>Set Path
>を実行しても、システム環境変数側の設定が表示されるのみで、

この点についてですが、
set PATHとした場合、システム環境変数とユーザー環境変数の両方が表示されないでしょうか?

>その結果、まず、システム環境変数側に設定した
>Work_Path=%SystemDrive%\Temp
>が、"再起動後"でないと「コマンドプロンプト」上に表示されませんでした。

ここは私の書き間違いでした。
おっしゃるとおりシステム環境変数に登録した場合は、
再起動後でないと反映されません。
実際にはユーザー環境変数に登録していました。
その場合、コマンドプロンプトの再起動のみで反映されます。

>再起動後の「コマンドプロンプト」上では、正常に、
>UserPath=C:\Temp;C:\WINDOWS\system32;C:\WINDOWS;・・・・
>と再起展開されました。

なるほど。Windows 2000/2003 Serverでは大丈夫なのですね。
こちらはXP SP2をインストールした2台のPCで確認したのですが、
両方ともダメでした。

>レジストリに同じ"EnableExtensions"が複数箇所あるのをご存知でしょうか?

はい。全ての項目で1になっているのを確認済みです。

古いシェルで動かないのだったら理由は理解できるのですが、
"XPのみ"となるとちょっと気になりますね。
もう少し調べてみたいと思います。

補足日時:2009/09/11 21:15
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!