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


44

同僚とWindows XP Professional x64エディションがインストールされた同一のDellワークステーションがあります。

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

%JAVA_HOME%\bin;...

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

システムプロパティ->環境変数にアクセスし、JAVA_HOME変数の値を変更すると、コマンドラインから見つかったjavaのバージョンが予想どおりに変更されます。変更を確実に反映するために、これは新しいコンソールウィンドウを開始しています。

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

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

これは何が原因ですか?なぜ私のマシンが新しいJAVA_HOMEを使用してパスを再評価しないのですか?

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


9
閉会の投票をしている皆さん(現時点では3人)...どこかに重複がある場合は、それを示すコメントがあればいいと思います。それがだまされていないなら...そして、あなたがこの質問で間違っていると思うことを私に言うことも良いでしょう。
skiphoppy

1
おそらくプログラミングの問題よりもシステムの問題だからです。それはプログラミングに直接影響しますが、だから私はそれを閉じることに投票しません... :)

9
Attenion close-nazis:superuser.comとserverfault.comが到着する前に質問がStack Overflowで適切だった場合、それは今日でも適切であるという見解を促進したいと思います。これはプログラミングの質問です。
skiphoppy 09

プログラマーはこの問題を抱えているかもしれないWindowsのユーザーだけだということですか?黙れ、プログラマーナチ!次に、より適切なQ&Aサイトが到着する前に、ここに質問を投稿するオプションがありませんでした。SOのホスピタリティは、それを悪用するための議論であってはなりません。
ヴァル

私はWindows 10でこれを見ています-PATHへの変数置換が断続的に機能しませんでした。環境変数に移動して(変更せずに)保存し、新しいCMDプロンプトを開いて問題を解決しました。
トーマスW

回答:


37

パスは、システムパスとユーザーパスの連結です。さらに、システム環境変数にはユーザー環境変数への参照が含まれていない場合があり、そのような参照は展開されません。目的の結果を得るには、ユーザー環境変数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

望んだ通りに。


3
私のシステムには、いくつかのシステム環境変数と同じ名前のユーザー環境変数がいくつかありました。PATHをエコーし​​ても展開されません。これを読んだ後、優先して取得された(展開できない)かどうか疑問に思ったので、重複したユーザー変数を削除しました。これは今私のために働いています-多くの感謝。:)
マイケル14年

Powershellを介して元の展開されていないPATHを取得する方法はありますか?私はPATHに追加することを望んでいましたが、その中の展開されていない環境変数を保持していました。
CMCDragonkai 16

別の質問の助けを借りて解決しました。これを処理するPowerShellスクリプトを記述します。gist.github.com
CMCDragonkai

16

このキーの下で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を指定します。


うん...これは私がいつも忘れているように見える設定の1つです...厄介なレジストリ;
エディB

9

変数がスペースを含むパスに展開される場合、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が正しく展開されませんでした。その後、パスの一部を削除してみましたので、

STUDIO_BIN=C:\Program Files\Company Name

(「製品名10.4」を省略)とlo、そして見よ、次のCMDプロンプトは、適切に展開されたSTUDIO_BINのPATHを示していました!

奇妙なことに、戻って「製品名10.4」をSTUDIO_BINに追加した場合(それをいじり始める前に元々あったすべてのスペースを含む)、PATHはまだ正しく拡張されていました。

明らかに内容が十分に変更されているため、PATH変数は、環境変数ダイアログで機能するための追加の処理を受けます。製品のインストーラーによって変数が追加されたときに行われていない処理(レジストリ内のPATHを直接変更した可能性が高い)。

これもXPの問題であるとほぼ確信しています。新しい開発マシンを組み立てていたので、Windows 7で再登場しました。どうやら、Microsoftによって修正されていないようです。

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

このページは、コマンドラインまたはバッチファイルを使用してPATHを設定している場合に可能な回答を提供します。(SETの後にコマンド全体を引用符で囲みます。)環境変数を設定するためにインストールした製品がどのインストーラーを使用したかはわかりませんが、スペースを含むパスを適切に拡張するために必要な処理を行ったようです。

要約すると、次のいずれかが可能です。

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

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


7

私は2009年3月にMicrosoftのフォーラムでこれを尋ねましたが、解決しませんでした:

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


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

%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 \

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

代替テキスト

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

ProgramFiles%\ SysInternals; C:\ PROGRA〜1 \ Borland \ Delphi5 \ Projects \ Bpl; (中略)

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

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

次のスクリーンショットで見ることができます:

代替テキスト


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


5

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


2

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


2

MSTSCを使用して/ consoleセッションにログオンしながら、環境変数を追加します。

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

環境変数を変更しようとしたときのマシンへの接続方法によっては、O / Sに奇妙なことがあります。


1

「遅延環境変数の拡張」機能(またはその欠如)に関連している可能性があります。または、この機能を利用して常に正しいソリューションを得ることができます。

cmdプロンプトから

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

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

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

動作しない場合は、それをさらに数回実行し、どういうわけかそれ自体が動作します。


1

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

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

この仮説は、他の観察結果に準拠して%ProgramFiles%\Somethingます。ユーザーに 追加すると、変数の変更通知の時点でマシン環境で定義されているPATHため、常に予想される拡張が発生し%ProgramFiles%ます(ロード順序による-MACHINE、次にUSER)。しかし、マシン環境を修正するとき、正しい変数の展開はブート時にのみ発生します(現在のところこれが定期的に発生しない方法理由はわかりません)。


1

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

有効なPATHは、ユーザーのPATH変数とグローバルPATH変数の連結です。

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

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


0

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

Windows XP Pro SP3(32ビット)で試しました。%JAVA_HOME%(and %JAVAFX_HOME%など)が複数回出現するパスがあります。コマンドラインに移動し、タイプしてPATH、変数が展開されているのを確認します。良い。

の値を変更しますJAVA_HOME。同じコマンドラインウィンドウにPATH戻ります。再び、同じ値...(予想どおり)。

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

そこにある正確なメカニズムは不明ですが、cmd.exeを含む実行中のプログラムは、開始時に環境変数の値をキャプチャし、後を振り返らないようです... envの変更をリッスンしますが、あまり確かではありません)。

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

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


これではありません。変更後、新しいコマンドウィンドウでテストしています。システム値を変更しても、実行中のプロセスの値は変更されないという事実を認識しています。
skiphoppy 09

OK、したがって「おそらく」... :-)そして、私の説明は矛盾をカバーしていませんが、一部の初心者には役立つかもしれません...:-PIは、変数展開がパスのどこでも機能することを指摘したかったです。 ..一部のシステムでは!(私が使用したものすべて...常に32ビット)。

0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.