2010-09-03 25 views

Respuesta

18

Perdón por la respuesta larga, pero una respuesta corta a su pregunta es imposible.

Antes que nada, debe comprender cómo funcionan las variables de entorno. Hay algunos lugares en el registro como HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment y HKEY_CURRENT_USER\Environment donde se mantendrán las variables de entorno. En la puesta en marcha, el sistema de operación lee estas claves de registro. Luego, un proceso de Windows crea otro proceso de Windows. El proceso principal puede dar al cliente el proceso de cualquier conjunto de variables de entorno. Si el proceso principal no hace esto, el proceso hijo hereda las variables de entorno de los procesos principales.

Para poder actualizar las variables de entorno de un proceso en ejecución con respecto a los mensajes WM_WININICHANGE o WM_SETTINGCHANGE. Una aplicación de Windows puede interpretar estos mensajes y volver a leer las variables de entorno actuales desde el registro HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment y HKEY_CURRENT_USER\Environment. Por lo que puede en los valores de registro de cambio generales contenidas en el HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment o HKEY_CURRENT_USER\Environment y enviar

SendMessage (HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment"); 

Sería mucho mejor usar SendMessageTimeout en lugar de SendMessage, pero la idea será la misma. El problema es que otros procesos no deben esperar el mensaje y hacer algo. La mayoría de las aplicaciones de la consola no tienen ningún bucle de mensajes y no hacen nada si envía tales mensajes.

Por lo tanto, es importante comprender que hay no manera simple de actualizar las variables de entorno de todos los procesos sin reiniciar la computadora. Debe tener una comprensión clara de esto y reducir su pregunta un poco.

Si actualiza el entorno en el registro y envía a continuación SendMessage (HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment") nuevo creado por los transformados Explorer.exe será tener nuevas variables de entorno, pero cmd.exe no hará esto.

Si desea actualizar las variables de entorno de la corriente cmd.exe dentro de un lote de ejecución se puede hacer lo siguiente: Se puede crear un nuevo archivo de CMD, por ejemplo t.cmd en el directorio% TEMP%, escribir en el archivo SET PATH=%PATH%;C:\BlaBla y luego use call %TEMP%\t.cmd y dell %TEMP%\t.cmd para actualizar las variables de entorno del actual cmd.exe.

Para estar exactamente hay más lugares que se utilizan para generar variables de entorno de nuevos procesos creados. Estas son las subclaves del archivo de clave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths y %SystemRoot%\System32\autoexec.nt. Uno se usará para procesos creados por ShellExecute y ShellExecuteEx (por ejemplo, Explorer.exe) y otro para aplicaciones de consola.

+2

Wow, muchas gracias por la respuesta detallada. Estoy seguro de que será valioso para otros pueblos también. Dicho esto, estoy un poco decepcionado cuando pienso en lo fácil que es hacer algo así en Linux. – madewulf

4

Si solo le importan las instancias de proceso nuevas, y realmente desea que se realice a través de un archivo por lotes, entonces setx es lo que está buscando.

  • /M cambiará el PATH en HKEY_LOCAL_MACHINE en lugar de HKEY_CURRENT_USER.
    es decir, una variable del sistema, en lugar de la del usuario.
    ejemplo: SETX /M PATH "%PATH%;C:\your path with spaces"

Si desea directamente cambiar una variable de entorno para los procesos que se ejecutan actualmente, bueno, sí, eso es complicado y apparently not recommended:

Altering the environment variables of a child process during process creation 
is the only way one process can directly change the environment variables of 
another process. A process can never directly change the environment variables 
of another process that is not a child of that process. 

De lo contrario, como Oleg dice, mediante programación la mejor manera es cambiar el registro y enviar WM_SETTINGCHANGE y esperar que las aplicaciones sean lo suficientemente agradables para recogerlo.

+0

¡Genial, esto es exactamente lo que estaba buscando! Solo para el registro: ** 1) ** '/ M' establecerá una variable de sistema en lugar de una nueva variable de usuario cuando se configure' PATH'. Sintaxis Le: 'SETX/M PATH"% PATH%; C: \ tu ruta con espacios "' ** 2) ** Una desventaja: todas las variables del sistema dentro de 'PATH' se resolverán, como'% SystemRoot% '(se convertirá en 'C: \ Windows'), aunque no creo que esté mal. – Qwerty

Cuestiones relacionadas