Zmienne użytkownika a środowisko systemowe: czy zmienne systemowe zastępują zmienne użytkownika?

21

Podniosłem prawa do mojego laptopa, ale nie mam uprawnień administratora. Do modyfikowania zmiennych środowiskowych systemu wymagane są uprawnienia administratora. Spodziewałem się, że jeśli utworzę zmienną środowiskową użytkownika o takiej samej nazwie jak systemowa zmienna środowiskowa, zmienna użytkownika zastąpi zmienną systemową, ale wydaje się, że tak nie jest.

Po dodaniu zmiennej użytkownika o tej samej nazwie co zmienna systemowa otworzyłem nowe okno cmd i użyłem polecenia echo, aby wyświetlić zmienną. Pokazało mi wartość zmiennej systemowej zamiast wartości zmiennej użytkownika.

Chciałem tylko potwierdzić, że jest to oczekiwane zachowanie i zrozumieć uzasadnienie. Spodziewałbym się, że bardziej szczegółowe ustawienia użytkownika zastąpią ustawienia systemowe.

Mam system Windows 7.

Czad
źródło
Podczas zmiany zmiennych często trzeba całkowicie zrestartować system Windows. Zmiana zmiennej w ustawieniach nie zmieni działających procesów. Nowe procesy kopiują środowisko z uruchomionych procesów (w zależności od sposobu ich uruchomienia), więc samo uruchomienie procesu nie oznacza, że ​​otrzymujesz nowe środowisko.
Zoredache,
Uruchomiłem się ponownie i nadal po uruchomieniu „echo% path%” z okna cmd.exe wyświetla moją systemową zmienną env, a nie wartość zmiennej użytkownika. Więc usunąłem zmienną użytkownika, o Dostęp administratora, zmieniłem moją zmienną ścieżki systemowej i zrobiłem to samo echo cmd. Zaktualizowana wartość env została wyświetlona bez ponownego uruchamiania. To mówi mi, że zmienne USER nie zastępują zmiennych systemowych i że ponowne uruchomienie nie jest konieczne. Neitehr jest tym, czego się spodziewałem.
Czad
Jaka procedura została zastosowana do dodania zmiennej użytkownika o tej samej nazwie co zmienna systemowa ? Coś takiego ?
JosefZ,
JosefZ: tak, dodałem dwie zmienne środowiskowe, jedną USER, drugą SYSTEM, obie o tej samej nazwie, używając GUI Windows 7 podobnego do ekranów pokazanych w twoim linku.
Czad
@Chad Czy odpowiedź, którą zaakceptowałeś, nie jest dokładnie odwrotna do twojej wrażliwości? Jak wytłumaczysz rozbieżność?
RockPaperLizard,

Odpowiedzi:

25

Zgodnie z artykułem MSKB Zmienne środowiskowe w systemie Windows NT :

Zmienne środowiskowe użytkownika .... mają pierwszeństwo przed zmiennymi środowiskowymi systemu.

Jednym godnym uwagi wyjątkiem jest PATHzmienna będąca połączonym wynikiem zmiennych systemowych i użytkownika:

Ścieżka jest zbudowana ze ścieżki systemowej, którą można wyświetlić w polu Zmienne środowiska systemowego w oknie dialogowym System. Ścieżka użytkownika jest dołączana do ścieżki systemowej.

W artykule omówiono również identyczne wyjątki dotyczące interpretacji zmiennych LibPathi Os2LibPath, a także sposób obsługi tych określonych w autoexec.bat. Punkty te prawdopodobnie nie będą miały większego znaczenia w dzisiejszych typowych środowiskach.

Podziękowania dla odpowiedzi SO

Mówię: Przywróć Monikę
źródło
2
Czy jest możliwe, aby ścieżka użytkownika dodawała ścieżkę systemową?
Qwerty,
3

Wszystko, co powiedział Twisty Impersonator w swojej odpowiedzi, jest poprawne. Podkreślono pomysł dodania zmiennej ścieżki użytkownika i uważam, że konsekwencje tej różnicy wymagają dodatkowego potraktowania.

Ścieżka =% Ścieżka% (system); % Path% (użytkownik)

Po uruchomieniu program wykonywalny (lub dowolny skrypt wykonywalny, takich jak .bat, .vbsitd) nie trzeba, aby zapewnić pełną ścieżkę.

Na przykład, aby uruchomić java, możesz wpisać dowolny z tych:

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

java.exe -version

java -version

Pierwszy przykład wykorzystuje w pełni kwalifikowaną ścieżkę. To zawsze będzie używać wersji Java pod tą samą ścieżką.

Drugi przykład przejdzie przez każdy katalog w %Path%zmiennej środowiskowej, szukając pliku wykonywalnego o nazwie java.exe. Uruchomi pierwszy znaleziony i przestanie szukać. Jeśli istnieją dwa pliki o nazwie java.exegdzieś na %Path%stosowany jest tylko pierwszy znaleziony.

Trzeci przykład, podobnie jak drugi, będzie iterował katalogi wymienione w %Path%. Ponadto, ponieważ nie podano rozszerzenia pliku, do nazwy pliku dołączana jest lista wykonywalnych rozszerzeń plików w kolejności określonej w %PATHEXT%zmiennej środowiskowej. Jeśli istnieje kilka plików o nazwach java.com, java.exe, java.bat, itd. Gdzieś na %Path%stosowany jest tylko pierwszy znaleziony.

Możesz wyświetlić listę wykonywalnych rozszerzeń ścieżek w systemie, tworząc następujący plik wsadowy:

@echo off
echo %PATHEXT%
pause

Na moim komputerze są to:

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

Co to wszystko znaczy?

W przeciwieństwie do innych zmiennych środowiskowych ścieżka użytkownika nie pozwala na przesłonięcie ścieżki systemowej. Jest dokładnie odwrotnie. Z powyższych przykładów jest wiele przypadków, w których możesz zmienić domyślną wersję Java. Jeśli jednak w ścieżce systemowej znajduje się już wersja Java, jest to wersja ZAWSZE znajdowana jako pierwsza, ponieważ ścieżka jest przeszukiwana w kolejności od lewej do prawej, a ścieżka użytkownika jest dołączana po prawej stronie - ręka, ze ścieżką systemową po lewej stronie.

Co mogę z tym zrobić?

Jeśli nie masz dostępu do systemowych zmiennych środowiskowych, nie możesz zastąpić domyślnych programów na ścieżce systemowej przy użyciu ścieżki użytkownika. (W rzeczywistości musi tak być, w przeciwnym razie niektóre programy przestałyby działać poprawnie i otworzyłyby system na próby manipulacji przez złośliwe oprogramowanie. Nikt tego nie chce).

Zamiast tego musisz użyć w pełni kwalifikowanej ścieżki, jeśli musisz użyć określonej wersji.

JonathanDavidArndt
źródło
1
Czy jest możliwe, aby ścieżka użytkownika dodawała ścieżkę systemową?
Qwerty,
1
To byłby dobry temat na inne pytanie. (Szybkie wyszukiwanie na tej stronie nie ujawniło nic istotnego od razu.) Zadaj nowe pytanie i umieść link do niego tutaj w komentarzach!
JonathanDavidArndt