ユーザー環境変数とシステム環境変数:システム変数はユーザー変数をオーバーライドしますか?


21

私は自分のラップトップに対する昇格した権利を持っていますが、管理者の権利は持っていません。システム環境変数を変更するには管理者権限が必要です。システム環境変数と同じ名前のユーザー環境変数を作成した場合、ユーザー変数がシステム変数をオーバーライドすると予想されましたが、そうではないようです。

システム変数と同じ名前のユーザー変数を追加した後、まったく新しいcmdウィンドウを開き、echoコマンドを使用して変数を表示しました。ユーザー変数の値ではなく、システム変数の値が表示されました。

これが予想される動作であることを確認し、その背後にある理由を理解したかっただけです。より具体的なユーザー設定がシステム設定をオーバーライドすることを期待します。

Windows 7を使用しています。


変数を変更する場合、Windowsを完全に再起動する必要があります。設定の変数を変更しても、実行中のプロセスは変更されません。新しいプロセスは、実行中のプロセスから環境をコピーします(開始方法によって異なります)。したがって、プロセスを開始するだけでは、新しい環境を取得することにはなりません。
ゾレダチェ

再起動しても、cmd.exeウィンドウから「echo%path%」を実行すると、ユーザー変数の値ではなく、システム環境変数が表示されます。そこで、管理者アクセス権を持つユーザー変数を削除し、システムパス変数を変更し、同じecho cmdを実行しました。更新されたenv値は、再起動なしで表示されました。これにより、USER変数はシステム変数を上書きせず、再起動は必要ないことがわかります。Neitehrは私が期待したものです。
チャド

システム変数と同じ名前のユーザー変数追加するために使用した手順は何ですか?のようなもの
JosefZ

JosefZ:はい、リンクに表示されている画面に似たWindows 7 GUIを使用して、2つの環境変数を追加しました。
チャド

@Chadあなたが受け入れた答えは、あなたの経験の正反対ではありませんか?矛盾をどのように説明しますか?
RockPaperLizard

回答:


25

MSKB記事Windows NTの環境変数によると:

ユーザー環境変数....システム環境変数よりも優先されます。

一つの注目すべき例外はPATHある変数複合システムとユーザ変数の結果:

パスはシステムパスから構築されます。これは、[システム]ダイアログボックスの[システム環境変数]フィールドに表示できます。ユーザーパスはシステムパスに追加されます。

この記事では、LibPathOs2LibPath変数の展開に関する同一の例外と、で指定された変数のautoexec.bat処理方法についても説明しています。これらの点は、今日の典型的な環境ではほとんど関係がないと思われます。

このSO 回答の功績


2
ユーザーパスをシステムパスの前に付けることは可能ですか?
Qwerty

3

Twisty Impersonator が答えで言ったことはすべて正しいです。ユーザーパス変数が追加されるという考えが強調されており、その違いの結果には追加の処理が必要だと思います。

パス=%Path%(システム); %Path%(ユーザー)

あなたは、実行可能プログラム(またはのような任意の実行可能スクリプト、実行すると.bat.vbsなどを)あなたは完全修飾パスを指定する必要はありません。

たとえば、実行するにはjava、次のいずれかを入力できます。

C:/Program Files (x86)/Java/jre6/bin/java -version

java.exe -version

java -version

最初の例では、完全修飾パスを使用しています。これは、常にその正確なパスにあるJavaのバージョンを使用します。

2番目の例では、%Path%環境変数の各ディレクトリを調べて、という名前の実行可能ファイルを探しますjava.exe。最初に見つかったものを実行し、検索を停止します。上のどこかに名前の付いた2つのファイルがある場合、最初に見つかったファイルのみが使用されます。java.exe%Path%

3番目の例は、2番目と同様に、にリストされているディレクトリを反復処理し%Path%ます。さらに、ファイル拡張子が提供されなかったため、%PATHEXT%環境変数で指定された順序で、実行可能なファイル拡張子のリストがファイルの名前に追加されます。名前のいくつかのファイルがある場合はjava.comjava.exejava.bat上、等のどこかには%Path%、最初のものだけをFOUNDが使用されています。

次のバッチファイルを作成することにより、システム上の実行可能なパス拡張子のリストを表示できます。

@echo off
echo %PATHEXT%
pause

私のマシンでは、これらは次のとおりです。

.COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS; .JSE; .WSF; .WSH; .MSC; .PY

これはどういう意味ですか?

全く対照的その他の環境変数に、ユーザーパスは、システムパスを上書きすることはできません。まったく逆の場合です。上記の例から、Javaのデフォルトバージョンを変更する必要がある場合が多くあります。ただし、システムパスにすでにJavaバージョンがリストされている場合、それは常に最初に見つかるバージョンです。パスは左から右の順序で検索され、ユーザーパスが右側に追加されるためです。 -左側、システムパスがあります。

私はそれについて何ができますか?

システム環境変数にアクセスできない場合、ユーザーパスを使用してシステムパス上のデフォルトプログラムを上書きすることはできません。(実際、この方法でなければなりません。そうしないと、特定のプログラムが正常に動作しなくなり、システムが悪意のあるソフトウェアによって改ざんされる可能性があります。誰も望んでいません。)

代わりに、特定のバージョンを使用する必要がある場合は、完全修飾パスを使用する必要があります。


1
ユーザーパスをシステムパスの前に付けることは可能ですか?
Qwerty

1
それは別の質問の良いトピックになるでしょう。(このサイトをすばやく検索しても、すぐに関連するものは明らかになりませんでした。)気軽に新しい質問をし、コメントへのリンクをここに投稿してください。
JonathanDavidArndt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.