web-dev-qa-db-ja.com

WindowsがPathの環境変数を処理できないのはなぜですか?

私の同僚と私は、Windows XP Professional x64エディションがインストールされている同一のDellワークステーションを持っています。

私のパス環境変数は次で始まります:

%Java_HOME%\bin;...

私の同僚のパス変数には、同じ環境変数を使用して指定された同じディレクトリが含まれていますが、それは彼のパスの最初の項目ではありません。

システムプロパティ->環境変数にアクセスし、Java_HOME変数の値を変更すると、Javaのバージョンが期待どおりに変更されます。これにより、変更を確実に反映するために、まったく新しいコンソールウィンドウが開始されます。

しかし、私の同僚のマシンでは、そうではありません。彼は以前のバージョンのJavaを見つけて、Path変数を呼び出して保存するまで(たとえ変更を加えていなくても)続けます。)(これも、新しいコンソールを起動するときです)窓。)

私はWindowsでこの不整合を約6か月間観察しており、非常に興味があります。私たちのオフィスにはWindowsのバージョンが多すぎるため、これまでまったく同じOSバージョンを実行している2台のマシンでこれが発生することはめったにありませんでした。

何が原因ですか?自分のマシンが新しいJava_HOMEを使用してPathを再評価しないのはなぜですか?

(それはパスの最初のものではないからですか?そうであれば、それはどうしてですか?なぜですか?チェックするためにさらにテストを行いますが、今は彼はそれにうんざりしていて、仕事に戻りたいと思います。)

45
skiphoppy

パスは、システムパスとそれに続くユーザーパスを連結したものです。さらに、システム環境変数にはユーザー環境変数への参照が含まれておらず、そのような参照はnotに展開されます。希望する結果を得るには、ser環境変数PATHに%Java_HOME%への参照を挿入するか、そのような変数がまだ存在しない場合は作成します。

おそらく、単純化された例がこれをより明確にするでしょう。 SYSTEM環境が

ProgramFiles = C:\Program Files
SystemRoot = C:\WINDOWS
PATH = %SystemRoot%\SYSTEM32

ユーザーJSmithの環境は

Java_HOME = %ProgramFiles%\Java\bin
USERPROFILE = C:\USERS\JSmith
PATH = %Java_HOME%\bin;%USERPROFILE%\bin

結果のパスは次のようになります

C:\WINDOWS\SYSTEM32;C:\Program Files\Java\bin;C:\Users\JSmith\bin

望んだ通りに。

37
JPaget

このキーの下のWindowsレジストリを確認します。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Environment

環境変数を展開する必要がある場合(ここでは%Java_HOME%)

次に、変数REG_EXPAND_SZ値として設定する必要があります

コマンドラインでreg.exeを使用してレジストリ値を追加/編集する場合、デフォルトでREG_SZと入力します。 reg add /t REG_EXPAND_SZオプションを使用して、タイプREG_EXPAND_SZを指定します。

17
climenole

変数がスペースを含むパスに展開される場合、PATH変数内の環境変数の展開に明確な問題があります。

「OUR_ROOT = c:\ MyRoot」のような独自のシステムレベル変数を作成し、「PATH =;%OUR_ROOT%\ bin;」のようなシステムPATHで使用しました。そして、それは「PATH =; c:\ MyRoot\bin;」に正しく展開されます。これまでのところ問題ありません。

しかし、Windows 7(32ビット)では、製品自体をインストールして、次のようなシステム環境変数を作成しました。

STUDIO_BIN=C:\program files\Company Name\Product Name 10.4\bin

そしてそれをシステムのPATH変数に追加しました:

PATH=<other path elements>;%STUDIO_BIN%;<more path elements>

しかし、CMDに表示されるPATH値には、「%STUDIO_BIN%;」が含まれていました。拡張パスではありません。 [マイコンピュータ]> [プロパティ]> [詳細]> [環境変数]の値も展開されていません。つまり、そのディレクトリでDLLを必要とするプログラムを実行できませんでした。

STUDIO_BINを(マイコンピュータ>プロパティ>詳細設定...>環境変数を介して)スペースを埋め込まない名前に変更するだけです。

STUDIO_BIN=C:\ProductName\bin

cMDウィンドウを再起動すると、PATHは次のようになります。

PATH=<other path elements>;C:\ProductName\bin;<more path elements>

別の解決策は、マイコンピュータ>プロパティ>詳細...>環境変数ダイアログを使用して、PATHで使用しているシステム変数を十分に編集することです。文字を追加して削除して「変更」を行ってから、OKを押して、新しいCMDプロンプトを開始しましたが、PATHが正しく展開されませんでした。次に、パスのpartを削除しようとしたので、

STUDIO_BIN=C:\Program Files\Company Name

( "製品名10.4"を省略)そしてlo、そして次のCMDプロンプトは、STUDIO_BINが適切に拡張されたPATHを示しました!

不思議なことに、戻って "Product Name 10.4"をSTUDIO_BINに追加した場合(それをいじり始める前に元々あったすべてのスペースを含む)、PATHは正しく拡張されました。

明らかに、その内容に十分な変更を加えた場合、PATH変数は、[環境変数]ダイアログでいくつかの特別な処理を実行して、機能させることができます。変数が製品のインストーラーによって追加されたときに行われない処理(おそらく、レジストリーのPATHを直接変更しただけです)。

これは、XPの問題でもありました。新しい開発マシンを組み立てているときにWindows 7で再浮上しただけです。Microsoftによって修正されていないようです。

どうやら、%ProgramFiles%のようなMS定義の変数でさえ、PATHで正しく展開されません。

このページ は、コマンドラインまたはバッチファイルを介してPATHを設定している場合に可能な回答を提供します。 (SETの後にコマンド全体を引用符で囲みます。)環境変数を設定するためにインストールした製品がどのインストーラーを使用したかはわかりませんが、パスをスペースで正しく展開するために必要な処理はすべて回避されました。

つまり、要約すると、次のいずれかを行うことができます。

  • パスをスペースを含まないパスに変更(およびすべての関連ファイルを移動)する、または

  • [環境変数]ダイアログで展開に失敗した変数を編集します(変数を正しく処理するために十分に変更します-どれだけで十分かはわかりません)。

9
RobDavenport

2009年3月にマイクロソフトフォーラムで質問しましたが、解決できませんでした。

Path環境変数で%ProgramFiles%を使用する方法?


システムのパス環境変数にフォルダーを追加しようとしています。

追加したい%ProgramFiles%\ SysInternals

既存のパス変数に:

C:\ PROGRA〜1\Borland\Delphi5\Projects\Bpl; C:\ PROGRA〜1\Borland\Delphi5\Bin;%SystemRoot%\ system32;%SystemRoot%;%SystemRoot%\ System32\Wbem; C:\ Program Files\Microsoft SQL Server\80\Tools\BINN; C:\ Program Files\Microsoft SQL Server\80\Tools\Binn \; C:\ Program Files\Microsoft SQL Server\90\Tools\binn \; C:\ Program Files\Microsoft SQL Server\90\DTS\Binn \; C:\ Program Files\Microsoft SQL Server\90\Tools\Binn\VSShell\Common7\IDE \; C:\ Program Files\Microsoft Visual Studio 8\Common7\IDE\PrivateAssemblies \;%[〜#〜] systemroot [〜#〜]%\ System32\WindowsPowerShell\v1.0 \

だから私はあなたがそれを編集する場所に行きます:

alt text

そして、変数をパスに追加します。

ProgramFiles%\ SysInternals; C:\ PROGRA〜1\Borland\Delphi5\Projects\Bpl; (をちょきちょきと切る)

次に、新しいコマンドプロンプトウィンドウを開いても、環境変数は実際の値に置き換えられません。

パス=%ProgramFiles%\ SysInternals; C:\ PROGRA〜1\Borland\Delphi5\Projects\Bpl(snip)>

次のスクリーンショットで確認できます。

alt text


しかし、あなたの質問に答えるために:私は知りません。できないようです。

7
Ian Boyd

環境変数には、グローバルとユーザーの2つのレベルがあります。 %Java_home%をユーザー環境変数として設定しているが、グローバル変数を変更している場合、違いはわかりません。

5
Sekhat

MSTSCを使用して/ consoleセッションにログオンしている間に環境変数を追加します。

マシンを再起動すると、環境変数が保持されていることがわかります。

環境変数を変更しようとしたときにマシンにどのように接続されたかに応じて、O/Sに癖があるように見えます。

2
Justin

独自のユーザー環境変数を定義する場合は、PATHにスペースが含まれていないことを確認してください。例:C:\ GNAT\bin; C:\ GNAT\includeは、「;」の間のスペースのため、機能しません。および「C:\ GNAT\include」。

2
Nij

ログイン時に変数が設定される順序を考慮する必要があります。設定する前に変数を使用しようとすると、空の文字列として出力されます。

有効なPATHは、ユーザーのPATH変数とそれに続くグローバルPATH変数を連結したものです。

ユーザー変数はグローバル変数の前に設定されるため、ユーザーPATH変数でグローバル変数を使用することはできません。さらに、変数はアルファベット順に設定されるため、PATHの前にソートされる変数は使用できません。

(これは少なくともWindows 7に適用されます。新しいバージョンではテストしていません。)

2
cbarrick

私も同じ問題を抱えており、それを修正する方法を知っています。

PATHをもう一度編集しますが、変更は行わず、PATHを再保存します。何らかの理由で、これによりすべてのネストされた環境変数参照が再評価されます。

うまくいかない場合は、さらに数回実行してください。どういうわけか、それ自体がうまくいきます。

1
BAP

これは、「遅延環境変数拡張」機能(またはその欠如)に関連している可能性があります。または、この機能を利用して常に正しい解決策を見つけることができます。

コマンドプロンプトから

set /? 

テストする小さな例を含む「遅延環境変数の展開」を説明するセクションを読みます

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "%VAR%" == "after" @echo If you see this, it worked
)

エコーラインが表示されない場合は、それが原因である可能性があります...

ただし、/ Vオプションを指定してcmd.exeを開始する場合は、「!」を使用できます。 「%」の代わりに、行動を変える

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "!VAR!" == "after" @echo If you see this, it worked
)

私(XPで実行)では、最初のスクリプトは機能しませんでしたが、2番目のバージョンは機能しました(cmd.exe/Vを使用)

1
libjack

WindowsがPATHで変数を展開できないのは、まだ定義されていないことを考えるためです。考慮してください:

REM Ensure variable is undefined
SET UNDEFINED=
REM And then try to expand it
ECHO UNDEFINED=%UNDEFINED%

この仮説は私の他の観察に準拠しています-%ProgramFiles%\SomethingsersPATHに追加すると、マシンで定義されている場合、常に%ProgramFiles%の予期される拡張が発生します変数変更通知時の環境(読み込み順-MACHINE、次にUSER)。しかし、マシン環境を変更すると、正しい変数の展開はブート時にのみ発生します(現時点ではhowwhyは定期的に発生しません)。

1
user539484

システム>詳細設定>環境変数で環境変数の設定を解決しました。

ユーザー変数とグローバル変数(ユーザーはWindowsユーザー名)とシステム変数はグローバル変数の2つのパネルがあるため、Java_HOMEなどのユーザー変数から「新規」を設定し、パスを下に置くと、変数が設定されますあなたのグローバルパスがフォルダ内にプログラムファイルを持っている場合でも。

0
thunder_nemesis

おそらくあなたはそれを間違っているのですか?

私はWindowsで試しましたXP Pro SP3(32bit)。パスに%Java_HOME%(および%JAVAFX_HOME%など)が複数あるパスがあります。コマンドに移動します行にPATHと入力すると、変数が展開されます。

Java_HOMEの値を変更します。同じコマンドラインウィンドウに戻り、PATHに戻ります。同じ値...期待どおり(経験上)です。

新しいコマンドラインウィンドウを開き、PATH、gotchaと入力すると、新しい値が表示されます。

正確なメカニズムは何なのかはわかりませんが、cmd.exeを含む実行中のプログラムは、起動時に環境変数の値をキャプチャし、振り返らないようです(ただし、適切に動作するプログラムでは、環境の変更をリッスンします。

それは機能、バグ、または煩わしさとして見られるかもしれませんが、それはそれが機能する方法です。少なくとも、Win9Xの時代とは異なり、コンピューターを再起動する必要はありません。 NTタイム(IIRC)とは異なり、ログアウトして戻る必要はありません。

なぜ矛盾があるのですか?マイクロソフトのやり方は不可解です... :-P

0
PhiLho