Sorry für die lange Antwort, aber eine kurze Antwort auf Ihre Frage ist unmöglich.
Als erstes sollten Sie verstehen, wie Umgebungsvariablen funktionieren. Es gibt einige Stellen in der Registrierung wie HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
und HKEY_CURRENT_USER\Environment
wo die Umgebungsvariablen gehalten werden. Beim Start liest das Betriebssystem diese Registrierungsschlüssel. Dann erstellt ein Windows-Prozess einen anderen Windows-Prozess. Der Elternprozess kann dem Client-Prozess einen Satz von Umgebungsvariablen geben. Wenn der übergeordnete Prozess dies nicht tut, erbt der untergeordnete Prozess Umgebungsvariablen der übergeordneten Prozesse.
Aktualisieren von Umgebungsvariablen eines laufenden Prozesses in Bezug auf WM_WININICHANGE oder WM_SETTINGCHANGE Nachrichten. Eine Windows-Anwendung kann interpretieren diese Nachrichten und lesen Sie die aktuellen Umgebungsvariablen aus der Registrierung HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
und HKEY_CURRENT_USER\Environment
. So können Sie im Allgemeinen ändern Registrierungswerte unter HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
oder HKEY_CURRENT_USER\Environment
und senden
SendMessage (HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment");
Es wäre viel besser, SendMessageTimeout zu verwenden, anstatt SendMessage, aber die Idee wird das gleiche bleiben. Das Problem ist, dass andere Prozesse nicht warten auf die Nachricht und etwas tun müssen. Die meisten Konsolenanwendungen haben keine Nachrichtenschleife und tun nichts, wenn Sie solche Nachrichten senden.
So ist es wichtig zu verstehen, dass es keine einfache Möglichkeit gibt, um Umgebungsvariablen aller Prozesse ohne Neustart des Computers zu aktualisieren. Sie sollten dies klar verstehen und Ihre Frage ein wenig reduzieren.
Wenn Sie die Umgebung in der Registrierung aktualisieren und senden SendMessage (HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment")
dann neu von Explorer.exe erstellt verarbeitet werden neue Umgebungsvariablen haben, aber cmd.exe wird dies nicht tun.
Wenn Sie Umgebungsvariablen des aktuellen cmd.exe in einem Batchlauf aktualisieren möchten Sie Folgendes tun können: Sie können eine neue CMD-Datei zum Beispiel erstellen in Verzeichnis% TEMP% t.cmd, in den Schreib Datei SET PATH=%PATH%;C:\BlaBla
und dann call %TEMP%\t.cmd
und dell %TEMP%\t.cmd
verwenden, um die Umgebungsvariablen des aktuellen cmd.exe zu aktualisieren.
Um genau zu sein gibt es mehr Orte, die verwendet werden, um Umgebungsvariablen von neu erstellten Prozessen zu erstellen. Dies sind Teilschlüssel des Schlüssels HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
und %SystemRoot%\System32\autoexec.nt
Datei. Eines wird für Prozesse verwendet, die von ShellExecute
und ShellExecuteEx
(z. B. Explorer.exe) erstellt wurden, und ein anderes für Konsolenanwendungen.
Wow, vielen Dank für die ausführliche Antwort. Ich bin mir sicher, dass es auch für andere Menschen wertvoll sein wird. Das sagte, ich bin ein bisschen enttäuscht, wenn ich denke, wie einfach es ist, so etwas in Linux zu tun. – madewulf