Perché la mia riga di comando di Windows 8 non aggiorna il suo percorso


21

Avevo bisogno di aggiungere una nuova voce alla mia variabile PATH. Questa è un'attività comune per me nel mio lavoro, ma di recente ho iniziato a utilizzare Windows 8. Ho pensato che il processo sarebbe stato simile a Windows 7, Vista, XP ...

Ecco la mia sequenza di eventi:

  1. Apri Proprietà di sistema (Start-> [tipo "Pannello di controllo"] -> Pannello di controllo \ Sistema e sicurezza \ Sistema -> Impostazioni di sistema avanzate -> Variabili d'ambiente)
  2. Aggiungi il nuovo percorso all'inizio della mia variabile USER PATH (C: \ dev \ Java \ apache-ant-1.8.4 \ bin;)
  3. Aperto un prompt dei comandi (Start -> [digitare "prompt dei comandi" invio] -> [digitare "percorso" invio]

La mia nuova voce di percorso non è disponibile (vedi immagine e video allegati). Ho duplicato lo stesso identico processo su un computer Windows 7 e ha funzionato.

Cattura dello schermo delle variabili di ambiente

MODIFICARE

Variabili d'ambiente di Windows 8 e video del prompt dei comandi

MODIFICARE

Questo non è sicuramente il comportamento di Windows 7. Guarda questo video per vedere il comportamento che mi aspetto che funzioni in Windows 7. http://youtu.be/95JXY5X0fII

MODIFICA 31/05/2013

Quindi, dopo molta frustrazione, ho scritto una piccola app C # per testare l' WM_SETTINGCHANGEevento. Questo codice riceve l'evento in Windows 7 e Windows 8. Tuttavia, in Windows 8 sul mio sistema, non ottengo il percorso corretto; ma lo faccio in Windows 7. Questo non può essere riprodotto in altri sistemi Windows 8.

Ecco il codice 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 è equivalente a WM_SETTINGCHANGE

Programma C # in esecuzione in Windows 7 (puoi vedere l'evento che si verifica e raccoglie il percorso corretto).

Programma C # in esecuzione in Windows 8 (puoi vedere l'evento che si verifica, ma il percorso sbagliato).

C'è qualcosa nel mio ambiente che sta precipitando questo problema. Tuttavia, si tratta di un bug di Windows 8?

MODIFICA 2014-04-28

A causa di questo e di molti altri problemi, non utilizziamo più Windows 8 sul desktop. Non abbiamo un ambiente per continuare a testare e sperimentare questo problema. Non esiste ancora una risposta o una soluzione a questo problema per noi. Le risposte di seguito non hanno risolto il nostro problema.


2
Penso che sia necessario riavviare dopo aver apportato le modifiche affinché abbiano effetto.
Enigma,

@Enigma Why? Non avevo bisogno di riavviare in Windows 7, Vista, XP, 2000 ...
mawcsco,

@mawcsco L'hai fatto almeno in 7. L'apertura dei prompt dei comandi dal menu di avvio si avvia con l'ambiente dalla shell Explorer, che è stata caricata al momento dell'accesso. È necessario arrestare / riavviare explorer, disconnettersi o riconnettersi o riavviare il sistema.
Darth Android

1
@Enigma Non dovrebbe essere necessario un riavvio. serverfault.com/questions/8855/…
mawcsco,

1
Ho appena verificato questo su Windows 7 e Windows 8: in entrambi i casi la nuova variabile di ambiente era visibile cmdquando è stata lanciata una nuova istanza. Naturalmente il già in esecuzione cmdnon ha ottenuto l'ambiente aggiornato.
Alexey Ivanov,

Risposte:


7

Se si avvia il Prompt dei comandi dal menu Start o un collegamento sulla barra delle attività, è necessario:

  • Riavvia explorer. Uccidilo e riavvialo.
  • Disconnettersi e riaccedere (che riavvia in modo efficace explorer).
  • Riavvia il sistema (che si riavvia in modo efficace explorer).

L'ambiente non si aggiorna immediatamente perché gli ambienti vengono ereditati dal processo principale, ad eccezione di explorer, che viene avviato dal sistema al momento dell'accesso. Ecco come si comporta sul mio sistema Windows 7.

Pertanto, la modifica delle variabili di ambiente aggiorna le chiavi del Registro di sistema, ma queste chiavi non vengono rilette finché il sistema non deve creare un nuovo ambiente di accesso per l'avvio di alcuni processi. Il più delle volte, ciò non accade perché i processi sono figli di un processo che ha già un ambiente, quindi l'ambiente viene ereditato.


2
Assolutamente falso per Windows 7. Vedi il video che ho collegato nel mio post sopra.
mawcsco,

1
Huh. Hai sicuramente ragione lì, anche se ho sicuramente avuto le mie modifiche non applicabili immediatamente alle nuove finestre della console su Win 7 prima. Non riesco a ricordare quale fosse esattamente il mio flusso di lavoro. Giocherò con il mio sistema Win 8 quando torno a casa se nessuno ha una risposta per te.
Darth Android

5
Se si sono modificate le variabili di ambiente utilizzando la finestra di dialogo Proprietà del sistema, le modifiche vengono applicate immediatamente all'istanza di Explorer attualmente in esecuzione e tutti i processi avviati successivamente ottengono il nuovo ambiente. I processi già in esecuzione non aggiornano automaticamente le variabili di ambiente a meno che non gestiscano il WM_SETTINGCHANGEmessaggio.
Alexey Ivanov,

1
Amico, questo mi ha aiutato a capire il problema che avevo comunque. Uso AutoHotkey per avviare un prompt dei comandi e non funzionava fino a quando non ho riavviato autohotkey!
Moss

1
@mawcsco Ha funzionato per me, sto usando Windows 7.
laike9m

3

Da: http://support.microsoft.com/kb/104011 via /server//q/8855/158027

...

Tuttavia, si noti che le modifiche alle variabili di ambiente non comportano cambiamenti immediati. Ad esempio, se si avvia un altro prompt dei comandi dopo aver apportato le modifiche, le variabili di ambiente rifletteranno i valori precedenti (non quelli correnti). Le modifiche non avranno effetto fino a quando non ti disconnetti e poi riconnetti.

Per effettuare queste modifiche senza disconnettersi, trasmettere un messaggio WM_SETTINGCHANGE a tutte le finestre del sistema, in modo che qualsiasi applicazione interessata (come Windows Explorer, Program Manager, Task Manager, Pannello di controllo e così via) possa eseguire un aggiornamento. MAGGIORI INFORMAZIONI


Ad esempio, nei sistemi basati su Windows NT, il seguente frammento di codice dovrebbe propagare le modifiche alle variabili di ambiente utilizzate nel prompt dei comandi:

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

Nessuna delle applicazioni fornite con Windows 95 e Windows 98, inclusi Windows Explorer e Program Manager, risponde a questo messaggio. Pertanto, sebbene questo articolo possa essere tecnicamente implementato su Windows 95 e Windows 98, non vi è alcun effetto se non quello di notificare applicazioni di terze parti. L'unico metodo per modificare le variabili di ambiente globali su Windows 95 è modificare il file autoexec.bat e riavviare.


2
Windows Explorer in Windows 7 gestisce questo messaggio ed è sufficiente riavviare il Prompt dei comandi dalla barra delle applicazioni o dal menu Start.
Alexey Ivanov,

"Le modifiche alle variabili di ambiente dovrebbero avere effetto immediato, se si effettua la modifica tramite la finestra di dialogo Proprietà principale per il computer in questione (andare su Risorse del computer | Proprietà | Avanzate | Variabili di ambiente). Dopo che le modifiche sono state salvate, Explorer trasmette un messaggio WM_SETTINGCHANGE a tutte le finestre per informarli della modifica. " serverfault.com/questions/8855/…
mawcsco,

2
"Consiglio di sistema Questo articolo si applica a una versione di Windows diversa da quella in uso. Il contenuto di questo articolo potrebbe non essere pertinente per te. Visita il Centro soluzioni di Windows 8"
mawcsco,

Non mi sorprenderebbe che si tratti di un dettaglio dell'implementazione e che Microsoft non avesse intenzione di supportare questo comportamento in Windows 8 o versioni successive.
surfasb,

1

Il problema è con le impostazioni dell'utente. In Window 8, ogni utente ha le proprie variabili di ambiente.

Apri Proprietà di sistema (Start-> [tipo "Pannello di controllo"] -> Pannello di controllo \ Sistema e sicurezza \ Sistema -> Impostazioni di sistema avanzate -> Variabili d'ambiente)

L'approccio di cui sopra modificherà le variabili di ambiente per l'utente root, forse non per l'utente corrente.

Dovresti andare su account utente -> seleziona il tuo account corrente -> cambia le variabili di ambiente

Dopo la modifica, riavviare Power Shell. Poi

echo $env:JAVA_HOME

o

Get-ChildItem env

Spero che questo ti possa aiutare.


Penso che potresti aver perso i dettagli nei miei screenshot e video che mostra la finestra di dialogo con "Variabili utente per mwillia3". Questo è il mio nome utente. So per certo che stavo modificando le variabili d'ambiente corrette. L'app C # genera l'evento, con il vecchio valore, non con il valore aggiornato. Ho mollato. Sono abbastanza sicuro che si tratti di un bug di Win 8 e non ho più accesso a Windows 8 per testarlo.
mawcsco,

Alcune persone non leggono sempre i dettagli. Vedo questo su alcuni sistemi e non su altri, l'ho anche visto su Windows 7/2008. Non c'è rima o ragione per quando succede che ho trovato.
ferventcoder,

Stesso problema con Windows Server 2012 r2 anche dopo la propagazione di WM_SETTINGSCHANGED. Credo che sia un bug di Windows.
Vezenkov,

0

Prova SETX invece SET. Per esempioSETX PATH "%PATH%;MyPath"


1
Puoi spiegare perché SETX piuttosto che SETfunziona.
ChrisF,

Innanzitutto, non stavo usando la riga di comando, stavo usando la finestra di dialogo del sistema. In secondo luogo, il mio modello di comportamento funziona bene in Windows 7, ma a volte non in Windows 8. Puoi indicare la documentazione che mostra come SET e SETX sono cambiati tra Windows 7 e Windows 8?
mawcsco,

0

Se stai usando Windows 8.1, apri il prompt dei comandi come amministratore, quindi chiama il comando PATH e dovresti vederlo apparire lì. Quando torni al normale cmd, verrà visualizzato anche. E di fatto, dovresti essere in grado di avviare l'applicazione aggiunta dal prompt dei comandi.



-1

Funziona se si utilizza Win + R dal desktop per avviare cmd.exe? La mia ipotesi è che avviarlo dalla schermata Start causi che il genitore del cmd.exe avviato sia diverso da explorer.exe (WSAHost.exe, IIRC o come si chiama) e che il processo genitore non aggiorni il suo ambiente durante i messaggi WM_SETTINGCHANGE. Non ho una macchina Windows 8 a portata di mano per testare ...


Anche in Windows 8 l'interfaccia utente della schermata iniziale sembra essere parte di explorer.exe perché scompare quando viene ucciso explorer.exe.
binki,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.