¿Por qué mi línea de comando de Windows 8 no actualiza su ruta?

21

Necesitaba agregar una nueva entrada a mi variable PATH. Esta es una actividad común para mí en mi trabajo, pero recientemente comencé a usar Windows 8. Asumí que el proceso sería similar a Windows 7, Vista, XP ...

Aquí está mi secuencia de eventos:

  1. Abra las propiedades del sistema (Inicio-> [escriba "Panel de control"] -> Panel de control \ Sistema y seguridad \ Sistema -> Configuración avanzada del sistema -> Variables de entorno)
  2. Agregar la nueva ruta al comienzo de mi variable USER PATH (C: \ dev \ Java \ apache-ant-1.8.4 \ bin;)
  3. Abrió un símbolo del sistema (Inicio -> [escriba "símbolo del sistema" enter] -> [escriba "ruta" enter]

Mi nueva entrada de ruta no está disponible (ver imagen adjunta y video). Dupliqué exactamente el mismo proceso en una máquina con Windows 7 y funcionó.

Captura de pantalla de variables de entorno

EDITAR

Video de variables de entorno de Windows 8 y símbolo del sistema

EDITAR

Este definitivamente no es el comportamiento de Windows 7. Mire este video para ver el comportamiento que espero que funcione en Windows 7. http://youtu.be/95JXY5X0fII

EDITAR 31/05/2013

Entonces, después de mucha frustración, escribí una pequeña aplicación C # para probar el WM_SETTINGCHANGEevento. Este código recibe el evento tanto en Windows 7 como en Windows 8. Sin embargo, en Windows 8 en mi sistema, no obtengo la ruta correcta; pero lo hago en Windows 7. Esto no se pudo reproducir en otros sistemas Windows 8.

Aquí está el código 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 es equivalente a WM_SETTINGCHANGE

Programa C # que se ejecuta en Windows 7 (puede ver cómo se produce el evento y selecciona la ruta correcta).

Programa C # que se ejecuta en Windows 8 (puede ver el evento, pero la ruta incorrecta).

Hay algo en mi entorno que está precipitando este problema. Sin embargo, ¿ es esto un error de Windows 8?

EDITAR 28/04/2014

Debido a este y otros problemas, ya no usamos Windows 8 en el escritorio. No tenemos un entorno para continuar probando y experimentando con este problema. Todavía no hay respuesta o resolución para este problema para nosotros. Las respuestas a continuación no resolvieron nuestro problema.

mawcsco
fuente
2
Creo que debe reiniciar después de hacer los cambios para que surtan efecto.
Enigma
@Enigma ¿Por qué? No necesitaba reiniciar en Windows 7, Vista, XP, 2000 ...
mawcsco
@mawcsco Lo hiciste en 7 al menos. La apertura de las indicaciones de comando desde el menú de inicio se inicia con el entorno desde el shell de Explorer, que se cargó cuando inició sesión. Debe matar / reiniciar el explorador, cerrar sesión o volver a iniciarla, o reiniciar el sistema.
Darth Android
1
@Enigma Un reinicio no debería ser necesario. serverfault.com/questions/8855/…
mawcsco
1
Acabo de comprobar esto en Windows 7 y Windows 8: en cualquier caso, la nueva variable de entorno era visible cmdcuando se lanzaba una nueva instancia. Por supuesto, el que ya se está ejecutando cmdno obtuvo el entorno actualizado.
Alexey Ivanov

Respuestas:

7

Si está iniciando el símbolo del sistema desde el menú de inicio o un acceso directo en su barra de tareas, debe:

  • Reiniciar explorer. Mátalo y relancéalo.
  • Cerrar sesión y volver a iniciarla (que efectivamente se relanza explorer).
  • Reinicie el sistema (que también se reinicia de manera efectiva explorer).

El entorno no se actualiza inmediatamente porque los entornos se heredan de su proceso principal, con la excepción de explorer, que el sistema inicia al iniciar sesión. Así es como se comporta en mi sistema Windows 7.

Por lo tanto, cambiar las Variables de entorno actualiza las claves de registro, pero estas claves no se vuelven a leer hasta que el sistema tiene que crear un nuevo entorno de inicio de sesión para algún proceso que se inicie. La mayoría de las veces, esto no sucede porque los procesos son hijos de un proceso que ya tiene un entorno, por lo que el entorno se hereda.

Darth Android
fuente
2
Absolutamente falso para Windows 7. Vea el video que vinculé en mi publicación anterior.
mawcsco
1
Huh Definitivamente tiene razón allí, aunque definitivamente he tenido mis cambios que no se aplican inmediatamente a las nuevas ventanas de consola en Win 7 antes. Sin embargo, no puedo recordar cuál fue mi flujo de trabajo exacto. Jugaré con mi sistema Win 8 cuando llegue a casa si nadie tiene una respuesta para ti en ese momento.
Darth Android
55
Si cambió las variables de entorno utilizando el cuadro de diálogo Propiedades del sistema, los cambios se aplican inmediatamente a la instancia de Explorer que se está ejecutando actualmente, y todos los procesos iniciados posteriormente obtienen el nuevo entorno. Los procesos que ya se ejecutan no actualizan automáticamente sus variables de entorno a menos que manejen el WM_SETTINGCHANGEmensaje.
Alexey Ivanov
1
Amigo, esto me ayudó a entender el problema que tenía de todos modos. ¡Utilizo AutoHotkey para iniciar un símbolo del sistema, y ​​no funcionó hasta que reinicié autohotkey!
Moss
1
@mawcsco Funcionó para mí, estoy usando Windows 7.
laike9m
3

De: http://support.microsoft.com/kb/104011 a través de /server//q/8855/158027

...

Sin embargo, tenga en cuenta que las modificaciones a las variables de entorno no resultan en un cambio inmediato. Por ejemplo, si inicia otro símbolo del sistema después de realizar los cambios, las variables de entorno reflejarán los valores anteriores (no los actuales). Los cambios no surten efecto hasta que cierre la sesión y luego vuelva a iniciarla.

Para efectuar estos cambios sin tener que cerrar sesión, transmita un mensaje WM_SETTINGCHANGE a todas las ventanas del sistema, para que cualquier aplicación interesada (como el Explorador de Windows, el Administrador de programas, el Administrador de tareas, el Panel de control, etc.) pueda realizar una actualización. MÁS INFORMACIÓN


Por ejemplo, en sistemas basados ​​en Windows NT, el siguiente fragmento de código debe propagar los cambios en las variables de entorno utilizadas en el Símbolo del sistema:

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

Ninguna de las aplicaciones que se incluyen con Windows 95 y Windows 98, incluidos el Explorador de Windows y el Administrador de programas, responden a este mensaje. Por lo tanto, aunque este artículo puede implementarse técnicamente en Windows 95 y Windows 98, no tiene ningún efecto, excepto notificar a las aplicaciones de terceros. El único método para cambiar las variables de entorno global en Windows 95 es modificar el archivo autoexec.bat y reiniciar.

Enigma
fuente
2
El Explorador de Windows en Windows 7 maneja este mensaje, y es suficiente para reiniciar el símbolo del sistema desde la barra de tareas o el menú Inicio.
Alexey Ivanov
"Los cambios en las variables de entorno deben tener efecto de inmediato, si realiza el cambio a través del cuadro de diálogo principal de Propiedades para la computadora en cuestión (vaya a Mi PC | Propiedades | Avanzado | Variables de entorno). Después de guardar los cambios, Explorer emite un mensaje WM_SETTINGCHANGE a todas las ventanas para informarles del cambio ". serverfault.com/questions/8855/…
mawcsco
2
"Consejo del sistema Este artículo se aplica a una versión diferente de Windows que la que está utilizando. El contenido de este artículo puede no ser relevante para usted. Visite el Centro de soluciones de Windows 8"
mawcsco
No me sorprendería que este sea un detalle de implementación y que Microsoft no tuviera intenciones de admitir este comportamiento en Windows 8 o superior.
Surfasb
1

El problema es con su configuración de usuario. En la Ventana 8, cada usuario tiene sus propias variables de entorno.

Abra las propiedades del sistema (Inicio-> [escriba "Panel de control"] -> Panel de control \ Sistema y seguridad \ Sistema -> Configuración avanzada del sistema -> Variables de entorno)

El enfoque anterior editará las variables de entorno para el usuario raíz, tal vez no para su usuario actual.

Debe ir a la cuenta de usuario -> seleccione su cuenta actual -> cambiar variables de entorno

Después de cambiar, reinicie el shell de energía. Luego

echo $env:JAVA_HOME

o

Get-ChildItem env

Espero que esto te ayudará.

Vu Gia Truong
fuente
Creo que puede haber perdido los detalles en mis capturas de pantalla y video que muestra el cuadro de diálogo con "Variables de usuario para mwillia3". Ese es mi nombre de usuario. Sé con certeza que estaba editando las variables de entorno correctas. La aplicación C # dispara el evento, con el valor anterior, no el valor actualizado. Me di por vencido. Estoy bastante seguro de que este es un error de Win 8 y ya no tengo acceso a Windows 8 para probar esto.
mawcsco
Algunas personas no siempre leen los detalles. Veo esto en algunos sistemas y no en otros, incluso lo he visto en Windows 7/2008. No hay rima o razón para cuando sucede que he encontrado.
ferventcoder
Mismo problema con Windows Server 2012 r2 incluso después de propagar WM_SETTINGSCHANGED. Creo que es un error de Windows.
vezenkov
0

Prueba SETX en su lugar SET. P.ejSETX PATH "%PATH%;MyPath"

kct
fuente
1
¿Puedes explicar por qué en SETX lugar de SETtrabajar?
ChrisF
Primero, no estaba usando la línea de comando, estaba usando el diálogo del sistema. En segundo lugar, mi patrón de comportamiento funciona bien en Windows 7, pero a veces no en Windows 8. ¿Puede señalar la documentación que muestra cómo SET y SETX cambiaron entre Windows 7 y Windows 8?
mawcsco
0

Si está utilizando Windows 8.1, abra el símbolo del sistema como Administrador, luego llame al comando PATH y verá que aparece allí. Cuando regrese a cmd normal, también aparecerá. Y, de hecho, debería poder iniciar la aplicación agregada desde el símbolo del sistema.

viktorkh
fuente
-1

¿Funciona si usa Win + R desde el escritorio para iniciar cmd.exe? Supongo que iniciarlo desde la pantalla de inicio hace que el padre cmd.exe iniciado sea diferente de explorer.exe (WSAHost.exe, IIRC o como se llame), y ese proceso padre no actualiza su entorno durante los mensajes WM_SETTINGCHANGE. No tengo una máquina con Windows 8 a mano para probar ...

usuario348438
fuente
Incluso en Windows 8, la IU de la pantalla de inicio parece ser parte de explorer.exe porque desaparece cuando se elimina explorer.exe.
binki