Ich möchte eine .bat-Datei erstellen, die am Ende des Werts der Windows-PATH-Variablen eine Zeichenfolge hinzufügen würde. Warnung, ich möchte, dass diese Änderung endgültig ist und nicht nur für die aktuelle Sitzung funktioniert.
Weiß jemand einen Weg, dies zu tun? So viel wie möglich sollte es nicht von der Windows-Version abhängig sein
Entschuldigung für die lange Antwort, aber eine kurze Antwort auf Ihre Frage ist unmöglich.
Zunächst 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 diese Nachrichten interpretieren und die aktuellen Umgebungsvariablen aus der Registry HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
und HKEY_CURRENT_USER\Environment
erneut lesen. So können Sie im Allgemeinen die Registrierungswerte unter HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
oder HKEY_CURRENT_USER\Environment
ändern und senden
Es wäre viel besser, SendMessageTimeout anstelle von SendMessage , aber die Idee bleibt gleich. Das Problem ist, dass andere Prozesse nicht auf die Nachricht warten und etwas tun müssen. Die meisten Konsolenanwendungen haben keine Nachrichtenschleife und tun nichts, wenn Sie solche Nachrichten senden.
Es ist also wichtig zu verstehen, dass es eine no einfache Möglichkeit gibt, um Umgebungsvariablen aller Prozesse zu aktualisieren, ohne den Computer neu zu starten. Sie sollten dies klar verstehen und Ihre Frage ein wenig reduzieren.
Wenn Sie die Umgebung in der Registrierung aktualisieren und SendMessage (HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment")
senden, werden neue verarbeitete Dateien, die von Explorer.exe erstellt wurden, neue Umgebungsvariablen enthalten, aber cmd.exe nicht Mach das.
Wenn Sie Umgebungsvariablen der aktuellen cmd.exe in einem Batch-Lauf aktualisieren möchten, können Sie Folgendes tun: Sie können eine neue CMD-Datei erstellen, zum Beispiel t.cmd im Verzeichnis% TEMP% Schreiben Sie in die Datei SET PATH=%PATH%;C:\BlaBla
und verwenden Sie dann call %TEMP%\t.cmd
und dell %TEMP%\t.cmd
, um die Umgebungsvariablen der aktuellen cmd.exe zu aktualisieren.
Um genau zu sein, gibt es mehr Orte, die verwendet werden, um Umgebungsvariablen von neu erzeugten Prozessen zu erstellen. Dies sind Unterschlüssel der Schlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
und %SystemRoot%\System32\autoexec.nt
Datei. Einer wird für Prozesse verwendet, die von ShellExecute
und ShellExecuteEx
(zum Beispiel Explorer.exe) erstellt wurden, und ein anderer für Konsolenanwendungen.
Wenn Sie nur an neuen Prozessinstanzen interessiert sind und diese wirklich über eine Batchdatei ausgeführt werden sollen, dann ist setx
genau das, wonach Sie suchen.
/M
ändert PATH
in HKEY_LOCAL_MACHINE
anstelle von HKEY_CURRENT_USER
. SETX /M PATH "%PATH%;C:\your path with spaces"
Wenn Sie direkt eine Umgebungsvariable für gerade laufende Prozesse ändern wollen, nun ja, das ist kompliziert und anscheinend nicht empfohlen :
%Vor% Ansonsten, wie Oleg sagt, programmatisch ist der beste Weg, die Registrierung zu ändern und WM_SETTINGCHANGE
zu senden und zu hoffen, dass die Apps gut genug sind, um sie aufzuheben.