Dlaczego moja zmienna środowiskowa PATH różni się od wiersza polecenia?

10

Trochę ważnego tła: moja firma ma ogólny skrypt logowania VBS, który modyfikuje zmienną środowiskową PATH użytkownika po zalogowaniu i pozwala mi uruchamiać oprogramowanie, które ma zależności na mapowanych bazach danych DFS. Niedawno zainstalowałem Windows PowerShell SDK na moim komputerze z systemem Windows 7 Enterprise i próbowałem spróbować zmodyfikować moją zmienną środowiskową PATH z linii poleceń PowerShell.

Następnie zauważyłem, że nie mogę już uruchamiać aplikacji odpowiadających tym modyfikacjom PATH logowania i że edytor zmiennych środowiskowych PATH został ustawiony na coś innego niż to, co było wyświetlane, gdy wydałem 'echo %PATH%' z wiersza polecenia.

Na przykład (uproszczenie) z edytora zmiennych środowiskowych ( My Computer properties -> Advanced System Settings -> Environment Variables ) Miałem

 C:\MyDir\; C:\MyOtherDir

mając na uwadze, że kiedy to zrobiłem 'echo %PATH%' z wiersza polecenia otrzymałem:

 C:\MyDir\

Czy ktoś inny miał podobny problem i czy istniało jakieś rozwiązanie? Kiedy szukałem pomocy, natknąłem się na to:

(Powiązane?) Wątek StackOverflow

Przyszło mi do głowy, że jeśli skrypt logowania został zainicjowany przez coś innego niż moje środowisko Explorer.exe, to był problem. Jednak gdy sam uruchomiłem skrypt logowania, moja PATH z wiersza poleceń pozostała niezmieniona. Co to ma wspólnego z PowerShell? Tęsknię za tym, że jest to całkowicie połączone z tą instalacją.

PatternMatching
źródło
Jak zmodyfikowałeś ścieżkę w PowerShell? Gdzie powtórzyłeś% PATH%? W cmd.exe?
Werner Henze
ODPOWIEDŹ PONIŻEJ JEST GENIUS.
SDsolar

Odpowiedzi:

11

Windows ma dwie klasy zmiennych środowiskowych systemowe zmienne środowiskowe i zmienne środowiskowe użytkownika . Jeśli używasz echo %PATH% zobaczysz swoje zmienna środowiskowa użytkownika PATH. Tylko jeśli nie zdefiniowano żadnej zmiennej użytkownika, zmienna systemowa będzie obowiązywać dla procesów użytkownika.

The PATH separator ; nie powinno być puste.

Następujące Notatka Microsoft może być pomocne:

Możesz modyfikować zmienne środowiskowe użytkownika, edytując następujący klucz Rejestru:

   HKEY_CURRENT_USER \ 
         Environment

Możesz modyfikować zmienne środowiskowe systemu, edytując następujący klucz Rejestru:

   HKEY_LOCAL_MACHINE \ 
               SYSTEM \ 
    CurrentControlSet \ 
              Control \ 
      Session Manager \ 
          Environment

Zauważ, że każda zmienna środowiskowa, która musi zostać rozwinięta (na przykład podczas używania %SYSTEM% ) muszą być przechowywane w rejestrze jako REG_EXPAND_SZ wartość rejestru. Wszelkie wartości typu REG_SZ nie zostanie rozwinięty podczas odczytu z rejestru.

Dodatkowa uwaga: Za każdym razem, gdy proces zmienia swoje środowisko (zamiast ustawień rejestru, które definiują środowisko dla nowych procesów), zmiany są widoczne tylko dla procesów potomnych.

Axel Kemper
źródło
1
Chciałbym podkreślić punkt Axela, jeśli trzeba zmodyfikować zmienne środowiskowe, a następnie trzeba dokonać zmiany w rejestrze. Właściwie stworzyłem funkcję PowerShell, aby pomóc w tym: computerperformance.co.uk/powershell/powershell_env_path.htm
Guy Thomas
1
Nie ma żadnych wartości do modyfikacji, tylko dwie zmienne tmp i temp. Czy jesteś pewien, że jest to ścieżka dla użytkownika, którą należy zmodyfikować?
Johnny_D
Wydaje się, że to nie działa (przynajmniej przed restartem). Zmienna ścieżki nie znajduje się w środowisku HKCU, zmienna ścieżki w cmd.exe wyświetla się poprawnie, ale uruchomione aplikacje nadal widzą starą zmienną ścieżki.
Martin Argerami
@Martin: tak, uruchomiona aplikacja nie rozpoznaje zmian rejestru, ponieważ pobiera ich kopię pamięci środowiska podczas uruchamiania aplikacji. Ta kopia zależy od procesu macierzystego, który uruchamia podprocesy. Jeśli są na przykład uruchamiane z Eksploratora Windows, należy ponownie uruchomić Eksploratora, aby uzyskać nową PATH.
Axel Kemper
Tak, to właśnie skończyłem. Dzięki.
Martin Argerami