Mój kolega i ja mamy identyczne stacje robocze Dell z zainstalowanym systemem Windows XP Professional x64.
Zmienna środowiskowa My Path zaczyna się od:
%JAVA_HOME%\bin;...
Zmienna Path mojego kolegi zawiera ten sam katalog, określony przy użyciu tej samej zmiennej środowiskowej, ale nie jest to pierwszy element w jego Path.
Jeśli uzyskam dostęp do właściwości systemu -> zmiennych środowiskowych i zmienię wartość mojej zmiennej JAVA_HOME, wersja java znaleziona w wierszu poleceń zmieni się zgodnie z oczekiwaniami. To uruchamia zupełnie nowe okno konsoli, aby pamiętać o zmianach.
Ale na maszynie mojego kolegi tak nie jest. Nadal znajduje swoją poprzednią wersję Javy, dopóki nie wyświetli swojej zmiennej Path i nie zapisze jej (nawet jeśli nie dokona żadnych zmian). (Znowu dzieje się tak podczas uruchamiania nowego okna konsoli).
Obserwuję tę niespójność w systemie Windows od około 6 miesięcy i jestem bardzo ciekawy. W naszym biurze mamy zbyt wiele wersji systemu Windows, więc do tej pory rzadko miałem okazję zobaczyć, jak to się dzieje na dwóch komputerach z taką samą wersją systemu operacyjnego.
Co to powoduje? Dlaczego jego maszyna nie dokonuje ponownej oceny Path, używając nowego JAVA_HOME, kiedy robi to mój?
(Czy to dlatego, że nie jest to pierwsza rzecz na Ścieżce? Jeśli tak, jak to możliwe i dlaczego? Zrobiłbym więcej testów, aby to sprawdzić, ale myślę, że ma już tego dość i chciałby wrócić do pracy .)
źródło
Odpowiedzi:
Twoja ścieżka to konkatenacja ścieżki systemowej, po której następuje ścieżka użytkownika. Ponadto systemowe zmienne środowiskowe nie mogą zawierać odniesień do zmiennych środowiskowych użytkownika, a wszelkie takie odniesienia nie zostaną rozwinięte. Aby uzyskać pożądany wynik, wstaw odwołanie do% JAVA_HOME% w zmiennej środowiskowej użytkownika PATH lub utwórz taką zmienną, jeśli jeszcze nie istnieje.
Być może uproszczony przykład to wyjaśni. Załóżmy, że środowisko SYSTEM jest
a środowisko użytkownika JSmith to
wtedy powstałaby ścieżka
zgodnie z życzeniem.
źródło
Sprawdź w rejestrze systemu Windows pod tym kluczem:
JEŚLI zmienna środowiskowa musi zostać rozwinięta (tutaj:% JAVA_HOME%)
następnie zmienną należy ustawić jako wartość REG_EXPAND_SZ .
Jeśli używasz reg.exe za pomocą wiersza polecenia do dodawania / edycji wartości rejestru, domyślnie wpisuje REG_SZ. Określ typ REG_EXPAND_SZ, używając
reg add /t REG_EXPAND_SZ
opcji.źródło
Istnieje wyraźny problem z rozszerzaniem zmiennych środowiskowych w zmiennej PATH, gdy zmienna rozwija się do ścieżki zawierającej spacje.
Stworzyliśmy własne zmienne na poziomie systemu, takie jak „OUR_ROOT = c: \ MyRoot”, a następnie wykorzystaliśmy je w ŚCIEŻCE systemu, np. „PATH =;% OUR_ROOT% \ bin;” i to jest poprawnie rozwijane do „PATH =; c: \ MyRoot \ bin;”. Jak dotąd nie ma problemu.
Ale w systemie Windows 7 (32-bitowym) sam zainstalowałem produkt i utworzyłem systemowe zmienne środowiskowe w następujący sposób:
i dodał ją do zmiennej systemowej PATH:
Ale wartości PATH pokazane w CMD zawierały „% STUDIO_BIN%;” a nie rozwinięta ścieżka. Wartość w Mój komputer> Właściwości> Zaawansowane> Różnice środowiskowe również pozostała nierozwinięta. Oznaczało to, że nie mogłem uruchamiać programów wymagających biblioteki DLL w tym katalogu.
Po prostu zmieniając STUDIO_BIN (przez Mój komputer> Właściwości> Zaawansowane ...> Zmienne środowiskowe) na nazwę bez osadzonych spacji:
a następnie ponownie uruchamiając okno CMD, ŚCIEŻKA jest teraz:
Innym rozwiązaniem jest wystarczająca edycja zmiennej systemowej używanej w ŚCIEŻCE za pomocą okna dialogowego Mój komputer> Właściwości> Zaawansowane ...> Zmienne środowiskowe. Próbowałem dodać znak i usunąć go, aby dokonać „zmiany”, a następnie OK, uruchomiłem nowy monit CMD, a ŚCIEŻKA NIE została poprawnie rozwinięta. Następnie spróbowałem usunąć część ścieżki, tak było
(pomijając „Nazwę produktu 10.4”) i lo, a oto następny monit CMD pokazał ŚCIEŻKĘ z STUDIO_BIN odpowiednio rozwiniętym!
O dziwo, gdybym wrócił i dodał „Nazwę produktu 10.4” do STUDIO_BIN (w tym wszystkie spacje, które pierwotnie tam były, zanim zacząłem z nim wycinać), a ŚCIEŻKA JEST W dalszym ciągu poprawnie rozwinięta.
Najwyraźniej przy wystarczającej zmianie zawartości zmienna PATH jest poddawana dodatkowemu przetwarzaniu w oknie dialogowym Zmienne środowiskowe, które umożliwia jej działanie. Przetwarzanie, które nie jest wykonywane, gdy zmienna została dodana przez instalator produktu (który prawdopodobnie właśnie zmodyfikował PATH bezpośrednio w rejestrze).
Jestem prawie pewien, że to był problem również z XP. Właśnie pojawiło się dla mnie w systemie Windows 7, gdy tworzyłem nową maszynę programistyczną. Najwyraźniej nie zostało to naprawione przez Microsoft.
Najwyraźniej nawet zmienne zdefiniowane przez MS, takie jak% ProgramFiles%, nie rozwijają się poprawnie w ŚCIEŻCE.
Ta strona zawiera możliwą odpowiedź, jeśli ustawiasz PATH za pomocą wiersza polecenia lub pliku wsadowego. (Całą komendę po SET umieść w cudzysłowie). Nie wiem, jakiego instalatora użyłem produktu, który zainstalowałem, aby ustawić zmienne środowiskowe, ale najwyraźniej obejrzał to, co jest potrzebne do prawidłowego rozszerzenia ścieżek spacjami.
Podsumowując, możesz:
zmień ścieżki (i przenieś wszystkie powiązane pliki) na ścieżki bez spacji lub
edytuj zmienne, które nie rozwijają się w oknie dialogowym Zmienne środowiskowe (zmieniając je na tyle, aby umożliwić ich prawidłowe przetwarzanie - nie jestem pewien, ile wystarczy).
źródło
zapytałem o to na forach Microsoft w marcu 2009 roku i nigdy nie udało mi się rozwiązać:
Jak używać% ProgramFiles% w zmiennej środowiskowej Path? :
Próbuję dodać folder do systemowej zmiennej środowiskowej Path.
Chcę dodać % ProgramFiles% \ SysInternals
do istniejącej zmiennej ścieżki:
Więc idę w miejsce, w którym je edytujesz:
I dodaję moją zmienną do ścieżki:
Następnie otwierając nowe okno wiersza poleceń zmienna środowiskowa nie jest zastępowana jej rzeczywistą wartością:
Które można zobaczyć na poniższym zrzucie ekranu:
Ale żeby odpowiedzieć na twoje pytanie: nie wiem. Wydaje się, że nie da się tego zrobić.
źródło
istnieją dwa poziomy zmiennych środowiskowych: globalny i użytkownika. Jeśli ma% Java_home% ustawiony jako zmienna środowiskowa użytkownika, ale zamiast tego zmienia zmienną globalną, nie zobaczy żadnej różnicy.
źródło
Upewnij się, że w PATH nie ma spacji podczas definiowania własnych zmiennych środowiskowych użytkownika. np .: C: \ GNAT \ bin; C: \ GNAT \ include nie będzie działać z powodu odstępu między „;” i „C: \ GNAT \ include”.
źródło
Dodaj zmienne środowiskowe podczas logowania do sesji / console przy użyciu MSTSC.
Uruchom ponownie komputer, a przekonasz się, że zmienne środowiskowe zostaną zachowane.
Wygląda na to, że w O / S występuje dziwactwo w zależności od tego, jak byłeś podłączony do komputera, gdy próbowałeś zmienić zmienną środowiskową.
źródło
Może to być związane z funkcją „opóźnionego rozszerzenia zmiennej środowiskowej” (lub jej brak), a może możesz skorzystać z tej funkcji, aby zawsze mieć właściwe rozwiązanie.
z wiersza polecenia cmd
i przeczytaj sekcję opisującą „opóźnione rozszerzenie zmiennej środowiskowej”, która zawiera mały przykład do przetestowania
Jeśli nie otrzymasz linii echa, to może to wyjaśnić ...
Jeśli jednak uruchomisz program cmd.exe z opcją / V, możesz użyć „!” zamiast „%”, co zmienia zachowanie
Dla mnie (działający na XP) pierwszy skrypt nie działał, ale druga wersja działała (z cmd.exe / V)
źródło
Miałem ten sam problem i wiem, jak go naprawić, jego kulawizna.
Po prostu edytuj ŚCIEŻKĘ ponownie, ale nie wprowadzaj żadnych zmian i ponownie zapisz ŚCIEŻKĘ. Z jakiegoś powodu powoduje to, że wszystkie odwołania do zagnieżdżonych zmiennych środowiskowych są ponownie oceniane.
Jeśli to nie zadziała, zrób to jeszcze kilka razy, jakoś to po prostu zadziała.
źródło
Wierzę, że system Windows nie rozwija zmiennej w zmiennej PATH, ponieważ uważa to, czego jeszcze nie zdefiniował. Rozważać:
Hipoteza ta jest zgodna z moją inną obserwacją - dodanie
%ProgramFiles%\Something
do użytkownikówPATH
zawsze spowoduje spodziewane rozszerzenie%ProgramFiles%
, o ile zostało zdefiniowane w środowisku maszyny w momencie powiadomienia o zmianie zmiennej (należna kolejność ładowania - MASZYNA, a następnie UŻYTKOWNIK). Ale kiedy modyfikujesz środowisko maszynowe, poprawne rozszerzanie zmiennych zachodzi tylko w czasie uruchamiania (w tej chwili nie mam pojęcia, jak i dlaczego nie dzieje się to regularnie).źródło
Musisz wziąć pod uwagę kolejność ustawiania zmiennych podczas logowania. Jeśli spróbujesz użyć zmiennej przed jej ustawieniem, wyjdzie ona jako pusty ciąg.
Efektywna PATH to konkatenacja zmiennej PATH użytkownika, po której następuje globalna zmienna PATH.
Zmienne użytkownika są ustawione przed zmiennymi globalnymi, więc nie można używać zmiennych globalnych w zmiennej użytkownika PATH. Dodatkowo zmienne są ustawione w kolejności alfabetycznej, więc nie można używać zmiennych sortujących przed PATH.
(Dotyczy to przynajmniej systemu Windows 7. Nie testowałem tego na nowszych wersjach).
źródło
Być może robisz to źle?
Próbowałem z Windows XP Pro SP3 (32-bitowy). Mam ścieżkę z kilkoma wystąpieniami
%JAVA_HOME%
(i%JAVAFX_HOME%
itp.). Idę do wiersza poleceń, wpiszPATH
, widzę, że zmienne są rozwinięte. Dobry.Zmieniam wartość
JAVA_HOME
. Wróć do tego samego okna wiersza poleceń,PATH
ponownie, ta sama wartość ... zgodnie z oczekiwaniami (z doświadczenia!).Otwieram nowe okno wiersza poleceń, wpisz
PATH
, gotcha, widzę nową wartość.Nie jestem pewien, jaki jest tam dokładny mechanizm, ale wydaje się, że każdy uruchomiony program, w tym cmd.exe, przechwytuje wartości zmiennych środowiskowych w czasie uruchamiania i nie ogląda się wstecz ... (chociaż uważam, że dobry program może nasłuchuj zmian env, choć nie jestem tego pewien).
Może to być postrzegane jako funkcja lub błąd lub irytacja, ale tak to działa. Hej, przynajmniej w przeciwieństwie do Win9X razy, nie musimy restartować komputera! I w przeciwieństwie do czasów NT (IIRC), nie musisz się wylogowywać i cofać.
Dlaczego niespójność? Sposoby Microsoftu są nieodgadnione ... :-P
źródło
Rozwiązałem ustawianie zmiennych środowiskowych w System> Ustawienia zaawansowane> Zmienne środowiskowe .
Istnieją dwa panele, zmienne użytkownika i globalne (użytkownik to nazwa użytkownika systemu Windows), a zmienne systemowe to zmienne globalne, więc jeśli ustawisz „Nowy” ze zmiennych użytkownika, takich jak
JAVA_HOME
i umieścisz swoją ścieżkę poniżej, ustawisz zmienne, nawet jeśli twoja globalna ścieżka mieć pliki programu w folderze.źródło