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.
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