2010-09-03 15 views

Répondre

18

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.

+2

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

4

Si vous ne vous souciez que des nouvelles instances de processus, et que vous voulez vraiment que cela se fasse via un fichier séquentiel, alors vous avez besoin de setx.

  • /M va changer la PATH en HKEY_LOCAL_MACHINE au lieu de HKEY_CURRENT_USER.
    c'est-à-dire une variable système, au lieu de celle de l'utilisateur.
    exemple: SETX /M PATH "%PATH%;C:\your path with spaces"

Si vous voulez directement changer une variable d'environnement pour les processus en cours d'exécution, eh bien, oui, c'est compliqué et 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. 

Sinon, comme le dit Oleg, programme le meilleur moyen est de changer le registre et d'envoyer WM_SETTINGCHANGE et espérons que les applications sont assez sympa pour le ramasser.

+0

Super, c'est exactement ce que je cherchais! Juste pour l'enregistrement: ** 1) ** '/ M' définira une variable système au lieu de la nouvelle variable utilisateur lors de la définition de' PATH'. La syntaxe: 'SETX/M PATH"% PATH%; C: \ votre chemin avec des espaces "' ** 2) ** Un inconvénient: toutes les variables système dans 'PATH' seront résolues, comme'% SystemRoot% '(deviendra 'C: \ Windows'), bien que je ne pense pas que ce soit faux. – Qwerty