私は自分のラップトップに対して高い権限を持っていますが、管理者権限は持っていません。システム環境変数を変更するには、管理者権限が必要です。システム環境変数と同じ名前のユーザー環境変数を作成した場合、ユーザー変数がシステム変数をオーバーライドするはずですが、そうではないようです。
システム変数と同じ名前のユーザー変数を追加した後、新しいcmdウィンドウを開き、echoコマンドを使用して変数を表示しました。ユーザー変数の値ではなく、システム変数の値が表示されました。
これが予想される動作であることを確認し、その背後にある理由を理解したかっただけです。より具体的なユーザー設定がシステム設定をオーバーライドすることを期待します。
Windows 7を使用しています。
MSKB記事 によると、Windows NT の環境変数:
ユーザー環境変数....システム環境変数よりも優先されます。
注目すべき例外の1つは、システム変数とユーザー変数の結合結果であるPATH
変数です。
パスはシステムパスから作成され、[システム]ダイアログボックスの[システム環境変数]フィールドに表示されます。 ユーザーパスがシステムパスに追加されます。
この記事では、LibPath
変数とOs2LibPath
変数の展開に関する同一の例外、およびautoexec.bat
で指定された変数の処理方法についても説明しています。これらの点は、今日の一般的な環境ではほとんど関連性がないと思われます。
これのクレジットSO answer
Twisty Impersonator が their answer で述べたことはすべて正しい。ユーザーパス変数が追加されるという考えが強調されており、その違いの結果として、追加の処理が必要になると思います。
パス=%Path%(システム); %Path%(ユーザー)
実行可能プログラム(または.bat
、.vbs
などの実行可能スクリプト)を実行する場合、完全修飾パスを指定する必要はありません。
たとえば、Java
を実行するには、次のいずれかを入力します。
C:/Program Files (x86)/Java/jre6/bin/Java -version
Java.exe -version
Java -version
最初の例では、完全修飾パスを使用しています。これは常に、その正確なパスにあるJavaのバージョンを使用します。
2番目の例では、%Path%
環境変数の各ディレクトリを調べ、Java.exe
という名前の実行可能ファイルを探します。最初に見つかったものを実行し、検索を停止します。 Java.exe
という名前の2つのファイルが%Path%
のどこかにある場合、最初に見つかったファイルのみが使用されます。
3番目の例は、2番目の例と同様に、%Path%
にリストされているディレクトリを反復処理します。さらに、ファイル拡張子が提供されなかったため、実行可能ファイル拡張子のリストが、%PATHEXT%
環境変数で指定された順序でファイルの名前に追加されます。 Java.com
、Java.exe
、Java.bat
などの名前のファイルが%Path%
のどこかにある場合、最初に見つかったファイルのみが使用しました
次のバッチファイルを作成すると、システムで実行可能なパス拡張子のリストを表示できます。
@echo off
echo %PATHEXT%
pause
私のマシンでは、これらは次のとおりです。
.COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS; .JSE; .WSF; .WSH; .MSC; .PY
他の環境変数に対するスタークコントラストでは、ユーザーパスではシステムパスを上書きできません。正反対の場合です。上記の例から、Javaのデフォルトバージョンを変更する必要がある場合が多くあります。ただし、システムパスに既にJava=バージョンがリストされている場合は、常に最初に検出されるバージョンです。パスは左から右に順番に検索されるため、ユーザーパスは右側に追加され、システムパスは左側に追加されます。
システム環境変数にアクセスできない場合、ユーザーパスを使用してシステムパス上のデフォルトプログラムを上書きすることはできません。 (実際、これはでなければならないか、特定のプログラムが正常に動作しなくなり、悪意のあるソフトウェアによるシステムの改ざんを可能にします。誰も望んでいないそれ。)
代わりに、特定のバージョンを使用する必要がある場合は、完全修飾パスを使用する必要があります。