2010-09-03 7 views

Antwort

18

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.

+2

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

4

Wenn Sie nur an neuen Prozessinstanzen interessiert sind, und Sie möchten wirklich, dass es über eine Batchdatei erfolgt, dann suchen Sie nach setx.

  • /M die PATH in HKEY_LOCAL_MACHINE statt HKEY_CURRENT_USER ändern.
    , d. H. Eine Systemvariable anstelle des Benutzers.
    Beispiel: SETX /M PATH "%PATH%;C:\your path with spaces"

Wenn Sie direkt eine Umgebungsvariable ändern für aktuell laufende Prozesse zu wollen, na ja, ja, das ist kompliziert und 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. 

Ansonsten wie Oleg sagt, programmatisch Der beste Weg ist, die Registrierung zu ändern und WM_SETTINGCHANGE zu senden und hoffe, dass die Apps gut genug sind, um es aufzuheben.

+0

Großartig, genau das habe ich gesucht! Nur für den Rekord: ** 1) ** '/ M' wird eine Systemvariable anstelle der neuen Benutzervariable einstellen, wenn' PATH' eingestellt wird. Le Syntax: 'SETX/M PATH"% PATH%; C: \ Ihr Pfad mit Leerzeichen "' ** 2) ** Ein Nachteil: Alle Systemvariablen innerhalb 'PATH' werden aufgelöst, wie zum Beispiel'% SystemRoot% '(wird 'C: \ Windows'), obwohl ich das nicht falsch finde. – Qwerty

Verwandte Themen