Wenn ich eine Umgebungsvariable ändere oder hinzufüge, muss ich die Eingabeaufforderung neu starten. Gibt es einen Befehl, den ich ausführen könnte, ohne CMD neu zu starten?
windows
cmd
environment-variables
Eric Schoonover
quelle
quelle
Antworten:
Sie können die Systemumgebungsvariablen mit einem vbs-Skript erfassen, benötigen jedoch ein bat-Skript, um die aktuellen Umgebungsvariablen tatsächlich zu ändern. Dies ist also eine kombinierte Lösung.
Erstellen Sie eine Datei
resetvars.vbs
mit diesem Code und speichern Sie sie im Pfad:Erstellen Sie einen anderen Dateinamen resetvars.bat, der diesen Code enthält, denselben Speicherort:
Wenn Sie die Umgebungsvariablen aktualisieren möchten, führen Sie sie einfach aus
resetvars.bat
Entschuldigung :
Die beiden Hauptprobleme, die ich bei dieser Lösung hatte, waren
ein. Ich konnte keine einfache Möglichkeit finden, Umgebungsvariablen aus einem vbs-Skript zurück an die Eingabeaufforderung zu exportieren, und
b. Die Umgebungsvariable PATH ist eine Verkettung der PATH-Variablen des Benutzers und des Systems.
Ich bin mir nicht sicher, wie die allgemeine Regel für widersprüchliche Variablen zwischen Benutzer und System lautet. Daher habe ich mich dafür entschieden, das System vom Benutzer außer Kraft zu setzen, außer in der PATH-Variablen, die speziell behandelt wird.
Ich benutze den seltsamen vbs + bat + temporären bat-Mechanismus, um das Problem des Exportierens von Variablen aus vbs zu umgehen.
Hinweis : Dieses Skript löscht keine Variablen.
Dies kann wahrscheinlich verbessert werden.
HINZUGEFÜGT
Wenn Sie die Umgebung von einem Cmd-Fenster in ein anderes exportieren müssen, verwenden Sie dieses Skript (nennen wir es
exportvars.vbs
):Führen Sie
exportvars.vbs
in dem Fenster , das Sie exportieren möchten , aus , wechseln Sie dann zu dem Fenster , das Sie exportieren möchten auf , und geben Sie :quelle
Hier ist, was Chocolatey verwendet.
https://github.com/chocolatey/choco/blob/master/src/chocolatey.resources/redirects/RefreshEnv.cmd
quelle
RefreshEnv
, um aktualisierte Umgebungsvariablen in Ihre aktuelle Sitzung aufzunehmen.Powershell
? Es scheint nurcmd.exe
für mich zu funktionieren .Unter Windows 7/8/10 können Sie Chocolatey installieren, das ein Skript für dieses integrierte Programm enthält.
Geben Sie nach der Installation von Chocolatey einfach ein
refreshenv
.quelle
Von Natur aus gibt es keine eingebaute für Windows Mechanismus zum Weitergeben einer Umgebungsvariablen zum Hinzufügen / Ändern / Entfernen an eine bereits ausgeführte cmd.exe, entweder von einer anderen cmd.exe oder von "Arbeitsplatz -> Eigenschaften -> Erweiterte Einstellungen ->" Umgebungsvariablen".
Wenn Sie eine neue Umgebungsvariable außerhalb des Bereichs einer vorhandenen offenen Eingabeaufforderung ändern oder hinzufügen, müssen Sie entweder die Eingabeaufforderung neu starten oder manuell mit SET in der vorhandenen Eingabeaufforderung hinzufügen.
Die zuletzt akzeptierte Antwort zeigt eine teilweise Umgehung durch manuelles Aktualisieren aller Umgebungsvariablen in einem Skript. Das Skript behandelt den Anwendungsfall des globalen Änderns von Umgebungsvariablen in "Arbeitsplatz ... Umgebungsvariablen". Wenn jedoch eine Umgebungsvariable in einer cmd.exe geändert wird, wird sie vom Skript nicht an eine andere laufende cmd.exe weitergegeben.
quelle
Ich bin auf diese Antwort gestoßen, bevor ich schließlich eine einfachere Lösung gefunden habe.
Starten Sie einfach
explorer.exe
im Task-Manager neu.Ich habe nicht getestet, aber möglicherweise müssen Sie auch Ihre Eingabeaufforderung erneut öffnen.
Gutschrift an Timo Huovinen hier: Knoten nicht erkannt, obwohl erfolgreich installiert (wenn dies Ihnen geholfen hat, geben Sie bitte die Gutschrift für den Kommentar dieses Mannes).
quelle
cmd
Fenster als Administrator. Verwenden Sie den Befehltaskkill /f /im explorer.exe && explorer.exe
. Dadurch wird der Prozess explorer.exe beendet und neu gestartet.Dies funktioniert unter Windows 7:
SET PATH=%PATH%;C:\CmdShortcuts
getestet durch Eingabe von echo% PATH% und es hat funktioniert, gut. Auch eingestellt, wenn Sie ein neues cmd öffnen, sind diese lästigen Neustarts nicht mehr erforderlich :)
quelle
setx
weil es die aktuelle Umgebung erbt, die möglicherweise geänderte Variablen enthält und nicht das, was ich dauerhaft möchte. Auf diese Weise kann ich vermeiden, die Konsole neu zu starten, um die Variablen zu verwenden, und gleichzeitig das Problem vermeiden, dass sie in Zukunft nicht mehr global verfügbar sind.Verwenden Sie "setx" und starten Sie die Eingabeaufforderung cmd neu
Für diesen Job gibt es ein Befehlszeilenprogramm mit dem Namen " setx ". Es ist zum Lesen und Schreiben env-Variablen. Die Variablen bleiben bestehen, nachdem das Befehlsfenster geschlossen wurde.
"Erstellt oder ändert Umgebungsvariablen in der Benutzer- oder Systemumgebung, ohne dass Programmierung oder Skripterstellung erforderlich sind. Der Befehl setx ruft auch die Werte von Registrierungsschlüsseln ab und schreibt sie in Textdateien."
Hinweis: Mit diesem Tool erstellte oder geänderte Variablen sind in zukünftigen Befehlsfenstern verfügbar, jedoch nicht im aktuellen CMD.exe-Befehlsfenster. Sie müssen also neu starten.
Wenn
setx
fehlt:Oder ändern Sie die Registrierung
MSDN sagt:
quelle
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\VARIABLE
aktuelle Benutzerumgebung:HKEY_CURRENT_USER\Environment\VARIABLE
%PATH%
dannsetx
kann dies zu 1024 Bytes gestutzt! Und einfach so verschwand sein AbendDas Aufrufen dieser Funktion hat bei mir funktioniert:
quelle
Die beste Methode, die ich mir ausgedacht habe, war, einfach eine Registrierungsabfrage durchzuführen. Hier ist mein Beispiel.
In meinem Beispiel habe ich eine Installation mit einer Batch-Datei durchgeführt, die neue Umgebungsvariablen hinzugefügt hat. Ich musste Dinge damit tun, sobald die Installation abgeschlossen war, konnte aber keinen neuen Prozess mit diesen neuen Variablen erzeugen. Ich habe das Laichen eines anderen Explorer-Fensters getestet und auf cmd.exe zurückgerufen. Dies hat funktioniert, aber unter Vista und Windows 7 wird der Explorer nur als einzelne Instanz und normalerweise als angemeldete Person ausgeführt. Dies würde bei der Automatisierung fehlschlagen, da ich meine Administrator-Creds dazu benötige Führen Sie Dinge aus, unabhängig davon, ob Sie vom lokalen System oder als Administrator auf der Box ausgeführt werden. Die Einschränkung besteht darin, dass Dinge wie der Pfad nicht behandelt werden, sondern nur einfache Umgebungsvariablen. Dies ermöglichte es mir, einen Stapel zu verwenden, um in ein Verzeichnis (mit Leerzeichen) zu gelangen und in Dateien zu kopieren, in denen .exes usw. ausgeführt werden. Dies wurde heute aus den Ressourcen von may auf stackoverflow.com geschrieben
Orginal Batch ruft neue Batch auf:
testenvget.cmd SDROOT (oder was auch immer die Variable ist)
Es gibt auch eine andere Methode, die ich mir aus verschiedenen Ideen ausgedacht habe. Siehe unten. Dies wird im Grunde die neueste Pfadvariable aus der Registrierung erhalten, dies wird jedoch eine Reihe von Problemen verursachen, da die Registrierungsabfrage Variablen an sich geben wird, was bedeutet, dass überall dort, wo es eine Variable gibt, dies nicht funktioniert, um dieses Problem zu bekämpfen Verdoppeln Sie im Grunde den Weg. Sehr böse. Die am meisten bevorzugte Methode wäre: Set Path =% Path%; C: \ Programme \ Software .... \
Unabhängig davon, ob es sich um die neue Batch-Datei handelt, seien Sie bitte vorsichtig.
quelle
Der einfachste Weg, dem Pfad eine Variable hinzuzufügen, ohne die aktuelle Sitzung neu zu starten, besteht darin, die Eingabeaufforderung zu öffnen und Folgendes einzugeben:
und drücke enter .
Geben Sie ein, um zu überprüfen, ob Ihre Variable geladen ist
und drücken enter. Die Variable ist jedoch nur ein Teil des Pfads, bis Sie neu starten.
quelle
Dies ist möglich, indem die Umgebungstabelle innerhalb eines bestimmten Prozesses selbst überschrieben wird.
Als Proof of Concept habe ich diese Beispiel-App geschrieben, die gerade eine einzelne (bekannte) Umgebungsvariable in einem cmd.exe-Prozess bearbeitet hat:
Beispielausgabe:
Anmerkungen
Dieser Ansatz wäre auch auf Sicherheitsbeschränkungen beschränkt. Wenn das Ziel auf einer höheren Höhe oder einem höheren Konto (z. B. SYSTEM) ausgeführt wird, haben wir keine Berechtigung, seinen Speicher zu bearbeiten.
Wenn Sie dies mit einer 32-Bit-App tun möchten, ändern sich die oben angegebenen fest codierten Offsets auf 0x10 bzw. 0x48. Diese Offsets können gefunden werden, indem die Strukturen _PEB und _RTL_USER_PROCESS_PARAMETERS in einem Debugger ausgegeben werden (z. B. in WinDbg
dt _PEB
unddt _RTL_USER_PROCESS_PARAMETERS
).Um den Proof-of-Concept in das zu ändern, was das OP benötigt, werden lediglich die aktuellen System- und Benutzerumgebungsvariablen (wie in der Antwort von @ tsadok dokumentiert) aufgelistet und die gesamte Umgebungstabelle in den Speicher des Zielprozesses geschrieben.
Bearbeiten: Die Größe des Umgebungsblocks wird auch in der Struktur _RTL_USER_PROCESS_PARAMETERS gespeichert, der Speicher wird jedoch auf dem Prozessheap zugewiesen. Von einem externen Prozess aus hätten wir also nicht die Möglichkeit, die Größe zu ändern und ihn zu vergrößern. Ich habe mit VirtualAllocEx herumgespielt, um zusätzlichen Speicher im Zielprozess für den Umgebungsspeicher zuzuweisen, und konnte eine völlig neue Tabelle festlegen und lesen. Leider stürzt jeder Versuch, die Umgebung auf normale Weise zu ändern, ab und brennt, da die Adresse nicht mehr auf den Heap verweist (sie stürzt in RtlSizeHeap ab).
quelle
Umgebungsvariablen werden in HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet \ Control \ Session Manager \ Environment gespeichert.
Viele der nützlichen Umgebungsvariablen, wie z. B. Path, werden als REG_SZ gespeichert. Es gibt verschiedene Möglichkeiten, auf die Registrierung zuzugreifen, einschließlich REGEDIT:
REGEDIT /E <filename> "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment"
Die Ausgabe beginnt mit magischen Zahlen. Um es mit dem Befehl find zu durchsuchen, muss es eingegeben und umgeleitet werden:
type <filename> | findstr -c:\"Path\"
Wenn Sie also nur die Pfadvariable in Ihrer aktuellen Befehlssitzung mit den Systemeigenschaften aktualisieren möchten, funktioniert das folgende Batch-Skript einwandfrei:
RefreshPath.cmd:
quelle
Versuchen Sie, als Administrator eine neue Eingabeaufforderung zu öffnen. Dies funktionierte für mich unter Windows 10. (Ich weiß, dass dies eine alte Antwort ist, aber ich musste dies teilen, weil es absurd ist, nur dafür ein VBS-Skript schreiben zu müssen).
quelle
Der Neustart des Explorers hat dies für mich getan, aber nur für neue cmd-Terminals.
Das Terminal, für das ich den Pfad festgelegt habe, konnte die neue Pfadvariable bereits sehen (in Windows 7).
quelle
Das Verwirrende könnte sein, dass es einige Stellen gibt, an denen das cmd gestartet werden kann. In meinem Fall habe ich cmd über den Windows Explorer ausgeführt und die Umgebungsvariablen haben sich nicht geändert, während beim Starten von cmd über "run" (Windows-Taste + r) die Umgebungsvariablen geändert wurden .
In meinem Fall musste ich nur den Windows Explorer-Prozess über den Task-Manager beenden und ihn dann über den Task-Manager erneut starten .
Sobald ich dies getan hatte, hatte ich Zugriff auf die neue Umgebungsvariable von einem cmd, der aus dem Windows Explorer erzeugt wurde.
quelle
Ich verwende den folgenden Code in meinen Batch-Skripten:
Durch die Verwendung von SET nach SETX ist es möglich, die "lokale" Variable direkt zu verwenden, ohne das Befehlsfenster neu zu starten. Und beim nächsten Lauf wird die Umgebungsvariable verwendet.
quelle
Ich mochte den Ansatz, dem schokoladig folgte, wie in der Antwort eines anonymen Feiglings angegeben, da es sich um einen reinen Batch-Ansatz handelt. Es bleiben jedoch eine temporäre Datei und einige temporäre Variablen übrig. Ich habe eine sauberere Version für mich gemacht.
Machen Sie
refreshEnv.bat
irgendwo auf Ihrem eine DateiPATH
. Aktualisieren Sie Ihre Konsolenumgebung durch AusführenrefreshEnv
.quelle
Wenn es sich nur um eine (oder einige) bestimmte Variablen handelt, die Sie ändern möchten, ist meiner Meinung nach der einfachste Weg eine Problemumgehung : Legen Sie sie einfach in Ihrer Umgebung UND in Ihrer aktuellen Konsolensitzung fest
Ich habe dieses einfache Batch-Skript, um meinen Maven von Java7 auf Java8 zu ändern (beide sind env. Vars). Der Batch-Ordner befindet sich in meiner PATH - Variable , sodass ich immer ' j8 ' und in meiner Konsole und in der Umgebung meine JAVA_HOME-Variable aufrufen kann wird geändert:
j8.bat:
Bis jetzt funktioniert das am besten und einfachsten. Sie möchten wahrscheinlich, dass dies in einem Befehl enthalten ist, aber in Windows ist es einfach nicht vorhanden ...
quelle
Die Lösung, die ich seit einigen Jahren verwende:
Edit: Woops, hier ist die aktualisierte Version.
quelle
Es gibt keinen geraden Weg, wie Kev sagte. In den meisten Fällen ist es einfacher, eine andere CMD-Box zu erzeugen. Noch ärgerlicher ist, dass laufende Programme auch keine Änderungen bemerken (obwohl IIRC möglicherweise eine Broadcast-Nachricht zu sehen hat, um über solche Änderungen informiert zu werden).
Es war schlimmer: In älteren Windows-Versionen musste man sich abmelden und dann wieder anmelden, um die Änderungen zu berücksichtigen ...
quelle
Ich benutze dieses Powershell-Skript, um es der PATH- Variablen hinzuzufügen . Mit ein wenig Anpassung kann es auch in Ihrem Fall funktionieren, glaube ich.
quelle
Vielen Dank, dass Sie diese Frage gestellt haben, die auch im Jahr 2019 sehr interessant ist (in der Tat ist es nicht einfach, das Shell-Cmd zu erneuern, da es sich um eine einzelne Instanz handelt, wie oben erwähnt), da durch das Erneuern von Umgebungsvariablen in Windows viele Automatisierungsaufgaben ohne ausgeführt werden können Die Befehlszeile muss manuell neu gestartet werden.
Wir verwenden dies beispielsweise, um die Bereitstellung und Konfiguration von Software auf einer großen Anzahl von Computern zu ermöglichen, die wir regelmäßig neu installieren. Und ich muss zugeben, dass ein Neustart der Befehlszeile während der Bereitstellung unserer Software sehr unpraktisch wäre und es erforderlich machen würde, Problemumgehungen zu finden, die nicht unbedingt angenehm sind. Kommen wir zu unserem Problem. Wir gehen wie folgt vor.
1 - Wir haben ein Batch-Skript, das wiederum ein Powershell-Skript wie dieses aufruft
[Datei: task.cmd] .
cmd
> powershell.exe -executionpolicy unrestricted -File C:\path_here\refresh.ps1
2 - Danach erneuert das Skript refresh.ps1 die Umgebungsvariablen mithilfe von Registrierungsschlüsseln (GetValueNames () usw.). Dann müssen wir im selben Powershell-Skript nur die neuen verfügbaren Umgebungsvariablen aufrufen. In einem typischen Fall können wir beispielsweise npm direkt aufrufen, um in derselben Sitzung bestimmte Pakete wie die folgenden zu installieren, wenn wir nodeJS zuvor mit cmd mithilfe von unbeaufsichtigten Befehlen installiert haben, nachdem die Funktion aufgerufen wurde.
[Datei: refresh.ps1]
Sobald das Powershell-Skript beendet ist, fährt das Cmd-Skript mit anderen Aufgaben fort. Beachten Sie nun, dass cmd nach Abschluss der Aufgabe immer noch keinen Zugriff auf die neuen Umgebungsvariablen hat, selbst wenn das Powershell-Skript diese in seiner eigenen Sitzung aktualisiert hat. Deshalb erledigen wir alle erforderlichen Aufgaben im Powershell-Skript, das natürlich dieselben Befehle wie cmd aufrufen kann.
quelle
Bearbeiten: Dies funktioniert nur, wenn die von Ihnen vorgenommenen Umgebungsänderungen auf das Ausführen einer Batchdatei zurückzuführen sind.
Wenn eine Batch-Datei mit beginnt
SETLOCAL
, wird sie beim Beenden immer wieder in Ihre ursprüngliche Umgebung zurückgeführt, selbst wenn Sie vergessen haben,ENDLOCAL
vor dem Beenden des Batches aufzurufen , oder wenn sie unerwartet abgebrochen wird.Fast jede Batch-Datei, mit der ich schreibe, beginnt,
SETLOCAL
da ich in den meisten Fällen nicht möchte, dass die Nebenwirkungen von Umgebungsänderungen bestehen bleiben. In Fällen, in denen bestimmte Änderungen an Umgebungsvariablen außerhalb der Batchdatei weitergegeben werden sollen,ENDLOCAL
sieht meine letzte wie folgt aus:quelle
Um dies zu lösen, habe ich die Umgebungsvariable mit BOTH setx und set geändert und dann alle Instanzen von explorer.exe neu gestartet. Auf diese Weise erhält jeder nachfolgend gestartete Prozess die neue Umgebungsvariable.
Mein Batch-Skript dazu:
Das Problem bei diesem Ansatz ist, dass alle derzeit geöffneten Explorer-Fenster geschlossen werden, was wahrscheinlich eine schlechte Idee ist. Lesen Sie jedoch den Beitrag von Kev, um zu erfahren, warum dies erforderlich ist
quelle