Dlaczego moja linia poleceń systemu Windows 8 nie zaktualizuje swojej ścieżki?

21

Musiałem dodać nowy wpis do mojej zmiennej PATH. Jest to dla mnie częste działanie, ale ostatnio zacząłem używać systemu Windows 8. Zakładałem, że proces będzie podobny do Windows 7, Vista, XP ...

Oto moja sekwencja wydarzeń:

  1. Otwórz właściwości systemu (Start-> [wpisz „Panel sterowania”] -> Panel sterowania \ System i zabezpieczenia \ System -> Zaawansowane ustawienia systemu -> Zmienne środowiskowe)
  2. Dodaj nową ścieżkę do początku mojej zmiennej USER PATH (C: \ dev \ Java \ apache-ant-1.8.4 \ bin;)
  3. Otwarto wiersz polecenia (Start -> [wpisz „wiersz polecenia” enter] -> [wpisz „path” enter]

Mój nowy wpis ścieżki nie jest dostępny (patrz załączony obraz i wideo). Powieliłem dokładnie ten sam proces na komputerze z systemem Windows 7 i zadziałało.

Zrzut ekranu zmiennych środowiskowych

EDYTOWAĆ

Zmienne środowiskowe Windows 8 i wideo z wierszem polecenia

EDYTOWAĆ

To zdecydowanie nie jest zachowanie systemu Windows 7. Obejrzyj ten film, aby zobaczyć zachowanie, którego oczekuję od pracy w systemie Windows 7. http://youtu.be/95JXY5X0fII

EDYTUJ 31.05.2013

Po wielu frustracjach napisałem małą aplikację w języku C #, aby przetestować to WM_SETTINGCHANGEwydarzenie. Ten kod odbiera zdarzenie zarówno w systemie Windows 7, jak i Windows 8. Jednak w systemie Windows 8 w moim systemie nie otrzymuję prawidłowej ścieżki; ale robię to w systemie Windows 7. Nie można tego odtworzyć w innych systemach Windows 8.

Oto kod C #.

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 jest równa WM_SETTINGCHANGE

Program C # działający w systemie Windows 7 (możesz zobaczyć, jak zdarzenie się pojawia i wybiera właściwą ścieżkę).

Program C # działający w systemie Windows 8 (można zobaczyć, że wydarzenie się pojawiło, ale zła ścieżka).

W moim środowisku jest coś, co przyspiesza ten problem. Czy jest to jednak błąd systemu Windows 8?

EDYCJA 28.04.2014

Z powodu tego i kilku innych problemów nie używamy już systemu Windows 8 na pulpicie. Nie mamy środowiska, aby kontynuować testowanie i eksperymentowanie z tym problemem. Nadal nie ma dla nas odpowiedzi ani rozwiązania tego problemu. Poniższe odpowiedzi nie rozwiązały naszego problemu.

mawcsco
źródło
2
Myślę, że musisz ponownie uruchomić komputer po wprowadzeniu zmian, aby zaczęły obowiązywać.
Enigma,
@Enigma Dlaczego? Nie musiałem restartować się w Windows 7, Vista, XP, 2000 ...
mawcsco
@mawcsco Zrobiłeś przynajmniej 7. Otwieranie podpowiedzi poleceń z menu Start uruchamia się wraz ze środowiskiem z powłoki Eksploratora, która została załadowana podczas logowania. Musisz zabić / ponownie uruchomić Eksploratora, wylogować się lub ponownie zalogować lub ponownie uruchomić system.
Darth Android
1
@Enigma Ponowne uruchomienie nie powinno być konieczne. serverfault.com/questions/8855/…
mawcsco
1
Właśnie sprawdziłem to w systemie Windows 7 i Windows 8: w obu przypadkach nowa zmienna środowiskowa była widoczna cmdpodczas uruchamiania nowej instancji. Oczywiście działające cmdjuż nie otrzymało zaktualizowanego środowiska.
Aleksiej Iwanow

Odpowiedzi:

7

Jeśli uruchamiasz wiersz polecenia z menu Start lub skrótu na pasku zadań, musisz:

  • Restart explorer. Zabij go i uruchom ponownie.
  • Wyloguj się i zaloguj ponownie (co skutecznie uruchamia się ponownie explorer).
  • Uruchom ponownie system (który również skutecznie uruchamia się ponownie explorer).

Środowisko nie aktualizuje się natychmiast, ponieważ środowiska są dziedziczone po procesie nadrzędnym, z wyjątkiem tego explorer, który jest uruchamiany przez system po zalogowaniu. Tak to działa w moim systemie Windows 7.

Tak więc zmiana zmiennych środowiska aktualizuje klucze rejestru, ale klucze te nie są ponownie odczytywane, dopóki system nie zbuduje nowego środowiska logowania dla niektórych uruchomionych procesów. W większości przypadków tak się nie dzieje, ponieważ procesy są potomkami procesu, który ma już środowisko, więc środowisko jest dziedziczone.

Darth Android
źródło
2
Absolutnie nieprawdziwe dla Windows 7. Zobacz wideo, które zamieściłem w moim poście powyżej.
mawcsco
1
Huh Zdecydowanie masz rację, chociaż na pewno moje zmiany nie stosowały się od razu do nowych okien konsoli w systemie Windows 7 wcześniej. Nie pamiętam jednak, jaki był mój dokładny przebieg pracy. Będę się bawić moim systemem Win 8, kiedy wrócę do domu, jeśli do tego czasu nikt nie będzie miał dla ciebie odpowiedzi.
Darth Android
5
Jeśli zmieniono zmienne środowiskowe za pomocą okna dialogowego Właściwości systemu, zmiany zostaną zastosowane natychmiast do aktualnie działającej instancji Eksploratora, a wszystkie procesy rozpoczęte później otrzymają nowe środowisko. Już uruchomione procesy nie aktualizują automatycznie swoich zmiennych środowiskowych, chyba że obsługują WM_SETTINGCHANGEkomunikat.
Aleksiej Iwanow
1
Stary, pomogło mi to zrozumieć problem, który i tak miałem. Używam AutoHotkey do uruchomienia wiersza polecenia i nie działał, dopóki nie uruchomiłem ponownie autohotkey!
Mech
1
@mawcsco To działało dla mnie, używam Windows 7.
laike9m
3

Od: http://support.microsoft.com/kb/104011 przez /server//q/8855/158027

...

Należy jednak pamiętać, że modyfikacje zmiennych środowiskowych nie powodują natychmiastowych zmian. Na przykład, jeśli po wprowadzeniu zmian uruchomisz inny wiersz polecenia, zmienne środowiskowe będą odzwierciedlać poprzednie (nie bieżące) wartości. Zmiany zaczną obowiązywać dopiero po wylogowaniu, a następnie ponownym zalogowaniu.

Aby wprowadzić te zmiany bez konieczności wylogowywania, wyślij komunikat WM_SETTINGCHANGE do wszystkich okien w systemie, aby wszystkie zainteresowane aplikacje (takie jak Eksplorator Windows, Menedżer programów, Menedżer zadań, Panel sterowania itp.) Mogły przeprowadzić aktualizację. WIĘCEJ INFORMACJI


Na przykład w systemach Windows NT następujący fragment kodu powinien propagować zmiany w zmiennych środowiskowych używanych w wierszu polecenia:

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

Żadna z aplikacji dostarczanych z systemem Windows 95 i Windows 98, w tym Eksplorator Windows i Menedżer programów, nie odpowiada na ten komunikat. Dlatego chociaż artykuł ten można technicznie wdrożyć w systemach Windows 95 i Windows 98, nie ma żadnego efektu poza powiadomieniem aplikacji innych firm. Jedyną metodą zmiany globalnych zmiennych środowiskowych w systemie Windows 95 jest zmodyfikowanie pliku autoexec.bat i ponowne uruchomienie.

Enigma
źródło
2
Eksplorator Windows w systemie Windows 7 obsługuje ten komunikat i wystarczy ponownie uruchomić wiersz polecenia z paska zadań lub menu Start.
Aleksiej Iwanow
„Zmiany zmiennych środowiskowych powinny zacząć obowiązywać natychmiast, jeśli dokonasz zmiany w głównym oknie dialogowym Właściwości dla danego komputera (przejdź do Mój komputer | Właściwości | Zaawansowane | Zmienne środowiskowe). Po zapisaniu zmian Explorer wysyła komunikat WM_SETTINGCHANGE do wszystkich okien, aby poinformować ich o zmianie ”. serverfault.com/questions/8855/…
mawcsco
2
„Wskazówka systemowa Ten artykuł dotyczy innej wersji systemu Windows niż ta, której używasz. Treść tego artykułu może być dla Ciebie nieodpowiednia. Odwiedź Centrum rozwiązań Windows 8”
mawcsco
Nie zaskoczyłoby mnie, że jest to szczegół implementacji i że Microsoft nie miał zamiaru obsługiwać tego zachowania w systemie Windows 8 lub nowszym.
surfasb
1

Problem dotyczy ustawień użytkownika. W Windows 8 każdy użytkownik ma swoje własne zmienne środowiskowe.

Otwórz właściwości systemu (Start-> [wpisz „Panel sterowania”] -> Panel sterowania \ System i zabezpieczenia \ System -> Zaawansowane ustawienia systemu -> Zmienne środowiskowe)

Powyższe podejście spowoduje edycję zmiennych środowiskowych dla użytkownika root, a może nie bieżącego użytkownika.

Powinieneś przejść do konta użytkownika -> wybrać swoje bieżące konto -> zmienić zmienne środowiskowe

Po zmianie zrestartuj powłokę zasilania. Następnie

echo $env:JAVA_HOME

lub

Get-ChildItem env

Mam nadzieję, że to ci pomoże.

Vu Gia Truong
źródło
Myślę, że mogłeś przegapić szczegóły na moich zrzutach ekranu i wideo, które pokazują okno dialogowe ze zmiennymi użytkownika dla mwillia3. To moja nazwa użytkownika. Wiem na pewno, że edytowałem prawidłowe zmienne środowiskowe. Aplikacja C # uruchamia zdarzenie ze starą wartością, a nie zaktualizowaną wartością. Poddałem się. Jestem całkiem pewien, że jest to błąd Win 8 i nie mam już dostępu do systemu Windows 8, aby to przetestować.
mawcsco
Niektórzy ludzie nie zawsze czytają szczegóły. Widzę to na niektórych systemach, a nie na innych, widziałem to nawet w systemie Windows 7/2008. Nie ma rymu ani powodu, dla którego zdarza się, że znalazłem.
ferventcoder,
Ten sam problem z Windows Server 2012 R2 nawet po propagacji WM_SETTINGSCHANGED. Uważam, że to błąd systemu Windows.
vezenkov
0

Spróbuj SETX zamiast SET. Na przykładSETX PATH "%PATH%;MyPath"

kct
źródło
1
Czy możesz wyjaśnić, dlaczego SETX zamiast SETdziała.
ChrisF
Po pierwsze, nie korzystałem z wiersza poleceń, korzystałem z okna dialogowego systemu. Po drugie, mój wzór zachowania działa dobrze w systemie Windows 7, ale czasami nie w systemie Windows 8. Czy możesz wskazać dokumentację pokazującą, jak SET i SETX zmieniły się między Windows 7 i Windows 8?
mawcsco
0

Jeśli korzystasz z systemu Windows 8.1, otwórz wiersz polecenia jako Administrator, a następnie wywołaj polecenie ŚCIEŻKA, a powinno się tam pojawić. Gdy wrócisz do normalnego cmd, również się pojawi. I w rzeczywistości powinieneś być w stanie uruchomić dodaną aplikację z wiersza poleceń.

Viktorkh
źródło
-1

Czy to działa, jeśli używasz Win + R z pulpitu, aby uruchomić cmd.exe? Domyślam się, że uruchomienie go z ekranu startowego powoduje, że rodzic uruchomionego cmd.exe różni się od explorer.exe (WSAHost.exe, IIRC lub jakkolwiek się nazywa), a ten proces nadrzędny nie aktualizuje swojego środowiska podczas komunikatów WM_SETTINGCHANGE. Nie mam pod ręką komputera z systemem Windows 8, aby przetestować ...

użytkownik348438
źródło
Nawet w Windows 8 interfejs użytkownika ekranu startowego wydaje się być częścią explorer.exe, ponieważ znika po zabiciu explorer.exe.
binki