Warum unterscheidet sich meine Umgebungsvariable PATH von der Eingabeaufforderung?

11

Ein wichtiger Hintergrund: Mein Unternehmen verfügt über ein generisches VBS-Anmeldeskript, das beim Anmelden Änderungen an der Umgebungsvariablen PATH des Benutzers vornimmt und es mir ermöglicht, Software auszuführen, die Abhängigkeiten von zugeordneten DFS-Dateifreigaben aufweist. Ich habe kürzlich auch das Windows Powershell SDK auf meinem Windows 7 Enterprise-Computer installiert und versucht, meine PATH-Umgebungsvariable über die Powershell-Befehlszeile zu ändern.

Im Anschluss daran stellte ich fest, dass ich keine Anwendungen mehr ausführen konnte, die diesen Anmelde-PATH-Änderungen entsprechen, und dass der Umgebungsvariablen-Editor PATH auf etwas anderes eingestellt war als das, was 'echo %PATH%'angezeigt wurde, als ich an der Eingabeaufforderung eine ausgab .

So zum Beispiel (Vereinfachung) aus dem Umgebungsvariablen-Editor ( My Computer properties -> Advanced System Settings -> Environment Variables), den ich hatte

 C:\MyDir\; C:\MyOtherDir

wohingegen ich 'echo %PATH%'an einer Eingabeaufforderung Folgendes bekam:

 C:\MyDir\

Hat jemand ein ähnliches Problem gehabt und gab es eine Lösung? Als ich um Hilfe googelte, stieß ich auf Folgendes:

(Verwandte?) StackOverflow-Thread

Mir fiel auf, dass dies das Problem war, wenn das Anmeldeskript von etwas anderem als meiner Explorer.exe-Umgebung initiiert wurde. Als ich das Anmeldeskript selbst ausführte, blieb mein PATH von der Eingabeaufforderung unverändert. Was hätte das mit PowerShell zu tun? Mir fehlt, wie dies vollständig mit dieser Installation verbunden ist.

PatternMatching
quelle
Wie haben Sie den Pfad in Powershell geändert? Wo haben Sie% PATH% wiedergegeben? In cmd.exe?
Werner Henze
Die Antwort unten ist genial.
SDsolar

Antworten:

11

Windows verfügt über zwei Klassen von Umgebungsvariablen, Systemumgebungsvariablen und Benutzerumgebungsvariablen . Wenn Sie verwenden echo %PATH%, wird Ihre Benutzerumgebungsvariable angezeigt PATH . Nur wenn keine Benutzervariable definiert ist, wird die Systemvariable für Benutzerprozesse wirksam.

Dem PATHTrennzeichen ;sollte kein Leerzeichen folgen.

Der folgende Microsoft-Hinweis kann hilfreich sein:

Sie können Benutzerumgebungsvariablen ändern, indem Sie den folgenden Registrierungsschlüssel bearbeiten:

   HKEY_CURRENT_USER \ 
         Environment

Sie können Systemumgebungsvariablen ändern, indem Sie den folgenden Registrierungsschlüssel bearbeiten:

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

Beachten Sie, dass jede Umgebungsvariable, die erweitert werden muss (z. B. bei Verwendung %SYSTEM%) , als Registrierungswert in der Registrierung gespeichert REG_EXPAND_SZwerden muss. Werte vom Typ REG_SZwerden beim Lesen aus der Registrierung nicht erweitert.

Zusätzliche Anmerkung: Wenn ein Prozess seine Umgebung ändert (anstelle der Registrierungseinstellungen, die die Umgebung für neue Prozesse definieren), sind die Änderungen nur für untergeordnete Prozesse sichtbar.

Axel Kemper
quelle
1
Ich möchte den Punkt von Axel hervorheben, wenn Sie die Umgebungsvariablen ändern müssen, dann müssen Sie die Änderung in der Registrierung vornehmen. Eigentlich habe ich eine PowerShell-Funktion erstellt, um dies zu unterstützen: computerperformance.co.uk/powershell/powershell_env_path.htm
Guy Thomas
1
Es müssen keine Werte geändert werden, nur zwei Variablen tmpund temp. Sind Sie sicher, dass dies der Pfad für den Benutzer ist, der geändert werden sollte?
Johnny_D
Dies scheint nicht zu funktionieren (zumindest vor einem Neustart). Die Pfadvariable befindet sich nicht in der Datei HKCU \ Environment. Die Pfadvariable in cmd.exe wird korrekt angezeigt, aber bei gestarteten Anwendungen wird die alte Pfadvariable weiterhin angezeigt.
Martin Argerami
@Martin: Ja, die gestartete Anwendung erkennt keine Registrierungsänderungen, da sie beim Start der Anwendung ihre Speicherkopie der Umgebung erhalten. Diese Kopie hängt vom übergeordneten Prozess ab, der die Unterprozesse startet. Wenn sie beispielsweise über den Windows Explorer gestartet werden, müssen Sie den Explorer neu starten, um den neuen Pfad zu erhalten.
Axel Kemper
Du hast es auf den Kopf genagelt! Der Pfad dort fügte einige Programme hinzu, von denen ich wusste, dass sie entfernt wurden, wie z. B. Microsoft SQL. Ich wusste, dass es nicht von dem von mir festgelegten Systemeigenschaftspfad kam. Vielen Dank - aus der Zukunft - Sie haben diese Antwort vor mehr als 3 Jahren gepostet.
SDsolar