Warum aktualisiert meine Windows 8-Befehlszeile den Pfad nicht?

21

Ich musste meiner PATH-Variablen einen neuen Eintrag hinzufügen. Dies ist eine häufige Aktivität für mich in meinem Job, aber ich habe kürzlich angefangen, Windows 8 zu verwenden. Ich bin davon ausgegangen, dass der Prozess Windows 7, Vista, XP ähnelt ...

Hier ist meine Abfolge von Ereignissen:

  1. Öffnen Sie die Systemeigenschaften (Start-> [Typ "Systemsteuerung"] -> Systemsteuerung \ System und Sicherheit \ System -> Erweiterte Systemeinstellungen -> Umgebungsvariablen).
  2. Füge den neuen Pfad zum Anfang meiner USER PATH-Variablen hinzu (C: \ dev \ Java \ apache-ant-1.8.4 \ bin;)
  3. Öffnete eine Eingabeaufforderung (Start -> [Typ "Eingabeaufforderung" eingeben] -> [Typ "Pfad" eingeben]

Mein neuer Pfadeintrag ist nicht verfügbar (siehe angehängte Bilder und Videos). Ich habe genau den gleichen Prozess auf einem Windows 7-Computer dupliziert und es hat funktioniert.

Screen Grab von Umgebungsvariablen

BEARBEITEN

Windows 8-Umgebungsvariablen und Eingabeaufforderungsvideo

BEARBEITEN

Dies ist definitiv nicht das Verhalten von Windows 7. In diesem Video wird das erwartete Verhalten unter Windows 7 gezeigt. Http://youtu.be/95JXY5X0fII

EDIT 31.05.2013

Also habe ich nach viel Frust eine kleine C # -App geschrieben, um das WM_SETTINGCHANGEEvent zu testen . Dieser Code empfängt das Ereignis sowohl in Windows 7 als auch in Windows 8. In Windows 8 auf meinem System erhalte ich jedoch nicht den richtigen Pfad. aber ich mache in Windows 7. Dies konnte nicht in anderen Windows 8-Systemen reproduziert werden.

Hier ist der C # -Code.

using System;
using Microsoft.Win32;

public sealed class App
{
    static void Main()
    {
        SystemEvents.UserPreferenceChanging += new UserPreferenceChangingEventHandler(OnUserPreferenceChanging);

        Console.WriteLine("Waiting for system events.");
        Console.WriteLine("Press <Enter> to exit.");
        Console.ReadLine();
    }

    static void OnUserPreferenceChanging(object sender, UserPreferenceChangingEventArgs e)
    {
        Console.WriteLine("The user preference is changing. Category={0}", e.Category);
        Console.WriteLine("path={0}", System.Environment.GetEnvironmentVariable("PATH"));
    }
}

OnUserPreferenceChanging ist äquivalent zu WM_SETTINGCHANGE

C # -Programm, das unter Windows 7 ausgeführt wird (Sie können sehen, dass das Ereignis eintrifft und den richtigen Pfad ermittelt).

C # -Programm, das unter Windows 8 ausgeführt wird (Sie können sehen, dass das Ereignis durchgelaufen ist, aber der falsche Pfad).

Es gibt etwas an meiner Umgebung, das dieses Problem auslöst. Ist dies jedoch ein Windows 8-Fehler?

EDIT 2014-04-28

Aufgrund dieses und mehrerer anderer Probleme wird Windows 8 auf dem Desktop nicht mehr verwendet. Wir haben keine Umgebung, um mit diesem Problem weiter zu testen und zu experimentieren. Es gibt noch keine Antwort oder Lösung für dieses Problem für uns. Die folgenden Antworten haben unser Problem nicht gelöst.

mawcsco
quelle
2
Ich denke, Sie müssen neu starten, nachdem Sie die Änderungen vorgenommen haben, damit sie wirksam werden.
Enigma
@ Enigma Warum? Ich brauchte nicht in Windows 7, Vista, XP, 2000 neu zu
starten
@mawcsco Du hast in 7 mindestens. Das Öffnen von Eingabeaufforderungen aus dem Startmenü wird mit der Umgebung über die Explorer-Shell gestartet, die beim Anmelden geladen wurde. Sie müssen entweder den Explorer beenden / neu starten, sich abmelden oder wieder anmelden oder das System neu starten.
Darth Android
1
@Enigma Ein Neustart sollte nicht erforderlich sein. serverfault.com/questions/8855/…
mawcsco
1
Ich habe dies gerade sowohl unter Windows 7 als auch unter Windows 8 überprüft: In beiden Fällen war die neue Umgebungsvariable sichtbar, cmdals eine neue Instanz gestartet wurde. Natürlich hat der bereits laufende cmddie aktualisierte Umgebung nicht bekommen.
Alexey Ivanov

Antworten:

7

Wenn Sie die Eingabeaufforderung über das Startmenü oder eine Verknüpfung in Ihrer Taskleiste starten, müssen Sie entweder:

  • Neu starten explorer. Töte es und starte es neu.
  • Melden Sie sich ab und wieder an (dies führt zu einem Neustart explorer).
  • Starten Sie das System neu (wodurch auch ein Neustart erfolgt explorer).

Die Umgebung wird nicht sofort aktualisiert, da Umgebungen von ihrem übergeordneten Prozess geerbt werden, mit Ausnahme von explorer, der beim Anmelden vom System gestartet wird. So verhält es sich auf meinem Windows 7-System.

Wenn Sie also die Umgebungsvariablen ändern, werden die Registrierungsschlüssel aktualisiert. Diese Schlüssel werden jedoch erst dann erneut gelesen, wenn das System für einen Prozess, der gestartet wird, eine neue Anmeldeumgebung erstellen muss. Meistens geschieht dies nicht, da Prozesse untergeordnete Elemente eines Prozesses sind, der bereits über eine Umgebung verfügt, sodass die Umgebung vererbt wird.

Darth Android
quelle
2
Absolut falsch für Windows 7. Siehe das Video, das ich in meinem Beitrag oben verlinkt habe.
mawcsco
1
Huh. Sie haben definitiv Recht, obwohl ich meine Änderungen definitiv nicht sofort auf neue Konsolenfenster unter Win 7 angewendet habe. Ich kann mich jedoch nicht erinnern, wie genau mein Arbeitsablauf war. Ich werde mit meinem Win 8-System herumspielen, wenn ich nach Hause komme und bis dahin niemand eine Antwort für Sie hat.
Darth Android
5
Wenn Sie Umgebungsvariablen über das Dialogfeld Systemeigenschaften geändert haben, werden die Änderungen sofort auf die aktuell ausgeführte Explorer-Instanz angewendet und alle anschließend gestarteten Prozesse erhalten die neue Umgebung. Bereits ausgeführte Prozesse aktualisieren ihre Umgebungsvariablen nur dann automatisch, wenn sie WM_SETTINGCHANGENachrichten verarbeiten.
Alexey Ivanov
1
Alter, das hat mir geholfen, das Problem zu verstehen, das ich sowieso hatte. Ich verwende AutoHotkey, um eine Eingabeaufforderung zu starten, und es hat nicht funktioniert, bis ich autohotkey neu gestartet habe!
Moos
1
@mawcsco Es hat bei mir funktioniert, ich benutze Windows 7.
laike9m
3

Von: http://support.microsoft.com/kb/104011 über /server//q/8855/158027

...

Beachten Sie jedoch, dass Änderungen an den Umgebungsvariablen keine sofortige Änderung zur Folge haben. Wenn Sie beispielsweise eine andere Eingabeaufforderung starten, nachdem Sie die Änderungen vorgenommen haben, geben die Umgebungsvariablen die vorherigen (nicht die aktuellen) Werte wieder. Die Änderungen werden erst wirksam, wenn Sie sich abmelden und wieder anmelden.

Senden Sie eine WM_SETTINGCHANGE-Nachricht an alle Fenster im System, damit alle interessierten Anwendungen (z. B. Windows Explorer, Programm-Manager, Task-Manager, Systemsteuerung usw.) ein Update durchführen können, ohne sich abmelden zu müssen. MEHR INFORMATIONEN


Auf Windows NT-basierten Systemen sollte beispielsweise das folgende Codefragment die Änderungen an den in der Eingabeaufforderung verwendeten Umgebungsvariablen weitergeben:

SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
    (LPARAM) "Environment", SMTO_ABORTIFHUNG,
    5000, &dwReturnValue);

Keine der mit Windows 95 und Windows 98 gelieferten Anwendungen, einschließlich Windows Explorer und Programm-Manager, antwortet auf diese Nachricht. Während dieser Artikel technisch auf Windows 95 und Windows 98 implementiert werden kann, gibt es keine Auswirkung, außer Anwendungen von Drittanbietern zu benachrichtigen. Die einzige Methode zum Ändern globaler Umgebungsvariablen unter Windows 95 besteht darin, die Datei autoexec.bat zu ändern und einen Neustart durchzuführen.

Rätsel
quelle
2
Windows Explorer in Windows 7 verarbeitet diese Meldung und es reicht aus, die Eingabeaufforderung über die Taskleiste oder das Startmenü neu zu starten.
Alexey Ivanov
"Änderungen an Umgebungsvariablen sollten sofort wirksam werden, wenn Sie die Änderung über das Haupteigenschaften-Dialogfeld des betreffenden Computers vornehmen (gehen Sie zu Arbeitsplatz | Eigenschaften | Erweitert | Umgebungsvariablen). Nachdem die Änderungen gespeichert wurden, sendet Explorer eine WM_SETTINGCHANGE-Nachricht an alle Fenster, um sie über die Änderung zu informieren. " serverfault.com/questions/8855/…
mawcsco
2
"Systemtipp Dieser Artikel bezieht sich auf eine andere als die von Ihnen verwendete Windows-Version. Der Inhalt dieses Artikels ist möglicherweise nicht für Sie relevant. Besuchen Sie das Windows 8 Solution Center."
mawcsco
Es würde mich nicht überraschen, dass dies ein Implementierungsdetail ist und dass Microsoft nicht beabsichtigt hat, dieses Verhalten in Windows 8 oder höher zu unterstützen.
Surfasb
1

Das Problem liegt in Ihrer Benutzereinstellung. In Windows 8 verfügt jeder Benutzer über eigene Umgebungsvariablen.

Öffnen Sie die Systemeigenschaften (Start-> [Typ "Systemsteuerung"] -> Systemsteuerung \ System und Sicherheit \ System -> Erweiterte Systemeinstellungen -> Umgebungsvariablen).

Bei der obigen Vorgehensweise werden Umgebungsvariablen für den Root-Benutzer bearbeitet, möglicherweise nicht für Ihren aktuellen Benutzer.

Sie sollten zum Benutzerkonto gehen -> Ihr aktuelles Konto auswählen -> Umgebungsvariablen ändern

Starten Sie die Power Shell nach dem Wechsel neu. Dann

echo $env:JAVA_HOME

oder

Get-ChildItem env

Hoffe das wird dir helfen.

Vu Gia Truong
quelle
Ich denke, Sie haben möglicherweise die Details in meinen Screenshots und Videos übersehen, die den Dialog mit "Benutzervariablen für mwillia3" zeigen. Das ist mein Benutzername. Ich weiß mit Sicherheit, dass ich die richtigen Umgebungsvariablen bearbeitet habe. Die C # -App löst das Ereignis mit dem alten Wert und nicht mit dem aktualisierten Wert aus. Ich gab auf. Ich bin mir ziemlich sicher, dass dies ein Win 8-Fehler ist, und ich habe keinen Zugriff mehr auf Windows 8, um dies zu testen.
Mawcsco
Manche Leute lesen nicht immer die Details. Ich sehe das auf einigen Systemen und nicht auf anderen, ich habe es sogar auf Windows 7/2008 gesehen. Es gibt keinen Reim oder Grund dafür, wann es passiert, dass ich gefunden habe.
ferventcoder
Dasselbe Problem mit Windows Server 2012 r2 auch nach der Weitergabe von WM_SETTINGSCHANGED. Ich glaube, es ist ein Windows-Fehler.
Vezenkov
0

Versuchen Sie SETX statt SET. Z.BSETX PATH "%PATH%;MyPath"

kct
quelle
1
Können Sie erklären, warum das SETX nicht SETfunktioniert?
ChrisF
Zuerst habe ich nicht die Befehlszeile verwendet, sondern den Systemdialog. Zweitens funktioniert mein Verhaltensmuster in Windows 7 einwandfrei, aber manchmal nicht in Windows 8. Können Sie auf eine Dokumentation verweisen, die zeigt, wie sich SET und SETX zwischen Windows 7 und Windows 8 geändert haben?
mawcsco
0

Wenn Sie Windows 8.1 verwenden, öffnen Sie die Eingabeaufforderung als Administrator, und rufen Sie den Befehl PATH auf. Dieser sollte dort angezeigt werden. Wenn Sie zu normalem cmd zurückkehren, wird es auch angezeigt. Tatsächlich sollten Sie in der Lage sein, die hinzugefügte Anwendung über die Eingabeaufforderung zu starten.

viktorkh
quelle
-1

Funktioniert es, wenn Sie mit Win + R vom Desktop aus cmd.exe starten? Ich vermute, dass das Starten über den Startbildschirm dazu führt, dass sich das übergeordnete Element der gestarteten Datei cmd.exe von explorer.exe (WSAHost.exe, IIRC oder wie auch immer es heißt) unterscheidet und dass der übergeordnete Prozess seine Umgebung während WM_SETTINGCHANGE-Nachrichten nicht aktualisiert. Ich habe keine Windows 8-Maschine zum Testen zur Hand ...

user348438
quelle
Selbst in Windows 8 scheint die Benutzeroberfläche des Startbildschirms Teil von explorer.exe zu sein, da sie verschwindet, wenn explorer.exe beendet wird.
Binki