Désolé pour la réponse longue, mais une réponse courte à votre question est impossible. Tout d'abord, vous devez comprendre le fonctionnement des variables d'environnement. Il y a des endroits dans le registre comme HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
et HKEY_CURRENT_USER\Environment
où les variables d'environnement seront bloquées. Au démarrage, le système d'exploitation lit ces clés de registre. Ensuite, un processus Windows crée un autre processus Windows. Le processus parent peut donner au processus client tout ensemble de variables d'environnement. Si le processus parent ne le fait pas, le processus enfant hérite des variables d'environnement des processus parents.
Pour pouvoir mettre à jour les variables d'environnement d'un processus en cours en ce qui concerne les messages WM_WININICHANGE ou WM_SETTINGCHANGE. Une application Windows peut interpréter ces messages et relire les variables d'environnement en cours à partir du registre HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
et HKEY_CURRENT_USER\Environment
. Ainsi, vous pouvez en modifier les valeurs générales de Registre sous HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
ou HKEY_CURRENT_USER\Environment
et envoyer
SendMessage (HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment");
Il serait préférable d'utiliser SendMessageTimeout au lieu de SendMessage, mais l'idée reste la même. Le problème est que les autres processus ne doivent pas attendre le message et faire quelque chose. La plupart des applications de console n'ont pas de boucle de message et ne font rien si vous envoyez de tels messages.
Il est donc important de comprendre qu'il existe non un moyen simple de mettre à jour les variables d'environnement de tous les processus sans redémarrer l'ordinateur. Vous devriez avoir une compréhension claire de ceci et réduire votre question un peu.
Si vous mettez à jour l'environnement dans le registre et d'envoyer SendMessage (HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment")
puis nouveau créé par transformés Explorer.exe sera avoir de nouvelles variables d'environnement, mais cmd.exe ne le fera pas. Si vous voulez mettre à jour les variables d'environnement de l'actuel cmd.exe dans une exécution par lots, vous pouvez effectuer les opérations suivantes: Vous pouvez créer un nouveau fichier CMD par exemple t.cmd dans le répertoire% TEMP%, écrire dans le fichier SET PATH=%PATH%;C:\BlaBla
puis utilisez call %TEMP%\t.cmd
et dell %TEMP%\t.cmd
pour mettre à jour les variables d'environnement de l'actuel cmd.exe. Pour être exactement il y a plus d'endroits qui sont utilisés pour construire des variables d'environnement de nouveaux processus créés. Ce sont des sous-clés du fichier HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
et %SystemRoot%\System32\autoexec.nt
. Un sera utilisé pour les processus créés par ShellExecute
et ShellExecuteEx
(par exemple Explorer.exe) et un autre pour les applications de console.
Wow, merci beaucoup pour la réponse détaillée. Je suis sûr que ce sera utile pour les autres peuples aussi. Cela dit, je suis un peu déçu quand je pense à quel point il est facile de faire une telle chose sous Linux. – madewulf