Windows hat den setx
Befehl:
Description:
Creates or modifies environment variables in the user or system
environment.
Sie können also eine Variable wie folgt festlegen:
setx FOOBAR 1
Und Sie können den Wert folgendermaßen löschen:
setx FOOBAR ""
Die Variable wird jedoch nicht entfernt. Es bleibt in der Registrierung:
Wie würden Sie die Variable tatsächlich entfernen?
windows
registry
environment-variables
Peter Mortensen
quelle
quelle
Antworten:
So entfernen Sie die Variable aus der aktuellen Umgebung ( nicht dauerhaft):
So entfernen Sie die Variable dauerhaft aus der Benutzerumgebung (dies ist der Standardort
setx
):Wenn die Variable in der Systemumgebung festgelegt ist (z. B. wenn Sie sie ursprünglich festgelegt haben
setx /M
), führen Sie als Administrator Folgendes aus:Hinweis: Die
REG
obigen Befehle wirken sich nicht auf vorhandene Prozesse aus (und auf einige neue Prozesse, die aus vorhandenen Prozessen abgeleitet wurden). Wenn es also wichtig ist, dass die Änderung sofort wirksam wird, ist es am einfachsten und sichersten, sich abzumelden und wieder anzumelden oder neu starten. Wenn dies keine Option ist oder Sie tiefer gehen möchten, enthalten einige der anderen Antworten hier einige großartige Vorschläge, die möglicherweise zu Ihrem Anwendungsfall passen.quelle
setx JUNK Hello
. Neues cmd öffnen. Tippeecho %JUNK%
und holeHello
. Dann tue ich dasREG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V JUNK
und bestätige, dass der Wert aus der Registrierung verschwunden ist. Ich öffne neue cmd und tippe undecho %JUNK%
bekomme immer nochHello
. Die Suche in der Registrierung zeigt keine Anwesenheit von 'JUNK'. Bitte sag mir nicht, dass du einen Neustart brauchst!user
Umgebungsbefehl zum ersten Mal eingebe. Wenn ich dann den Befehl erneut eingebe, erhalte ichThe system was unable to find the specified registry or key value
. Auch eine globale SucheJUNK
in der Registrierung mitregedit
ergibt nichts. Wenn ich dennoch ein neues Befehlsfenster öffne (über Start / Zubehör oder cmd.exe in Run) und tippeecho %JUNK%
, ist der Wert immer noch da!SET
Liste für die nächste cmd-Shell entfernt wird) und dann aus der Registrierung entfernen, z. B.:SETX FOOBAR "" & REG delete HKCU\Environment /F /V FOOBAR
Verwenden Sie den regulären integrierten
set
Befehl, um die Variable aus der aktuellen Befehlssitzung zu entfernen, ohne sie dauerhaft zu entfernen. Setzen Sie einfach nichts nach das Gleichheitszeichen:set FOOBAR=
Führen Sie zur Bestätigung
set
keine Argumente aus und überprüfen Sie die aktuelle Umgebung. Die Variable sollte vollständig in der Liste fehlen.quelle
Dies wurde schon viel behandelt, aber es fehlt eine wichtige Information. Hoffentlich kann ich helfen, die Funktionsweise zu klären und müden Reisenden Erleichterung zu verschaffen. :-)
Aus aktuellem Prozess löschen
Offensichtlich weiß jeder, dass Sie dies nur tun, um eine Umgebungsvariable aus Ihrem aktuellen Prozess zu löschen:
Dauerhaftes Löschen
Es gibt zwei Sätze von Umgebungsvariablen, systemweit und Benutzer.
Benutzerumgebungsvariable löschen:
Systemweite Umgebungsvariable löschen:
Wert ohne Neustart anwenden
Hier sind die magischen Informationen, die fehlen! Sie fragen sich, warum die Umgebungsvariable nach dem Starten eines neuen Befehlsfensters immer noch vorhanden ist. Der Grund dafür ist, dass explorer.exe seine Umgebung nicht aktualisiert hat. Wenn ein Prozess einen anderen startet, erbt der neue Prozess die Umgebung von dem Prozess, der ihn gestartet hat.
Es gibt zwei Möglichkeiten, dies zu beheben, ohne neu zu starten. Am brutalsten ist es, den Prozess explorer.exe zu beenden und erneut zu starten. Sie können dies über den Task-Manager tun . Ich empfehle diese Methode jedoch nicht.
Der andere Weg besteht darin, explorer.exe mitzuteilen, dass sich die Umgebung geändert hat und dass sie erneut gelesen werden sollte. Dies erfolgt durch Senden einer Windows-Nachricht (WM_SETTINGCHANGE). Dies kann mit einem einfachen PowerShell-Skript erreicht werden. Sie könnten leicht eine schreiben, um dies zu tun, aber ich habe eine in den Einstellungen des Aktualisierungsfensters nach Skriptänderungen gefunden :
Zusammenfassung
Gehen Sie wie folgt vor, um eine Benutzerumgebungsvariable mit dem Namen "FOO" zu löschen und die Änderung in den Prozessen zu berücksichtigen, die Sie anschließend starten.
Beachten Sie, dass Sie wahrscheinlich Ihre PowerShell-Einstellungen aktualisieren müssen, damit Sie dieses Skript ausführen können. Ich lasse dies jedoch als Google-Fu-Übung für Sie.
quelle
source .bashrc
(oder seine Cousins) in Windows. Dies steht für mich ganz oben in der Zeile "Verweis auf diese".In PowerShell können Sie die .NET-
[System.Environment]::SetEnvironmentVariable()
Methode verwenden:So entfernen Sie eine Benutzerumgebungsvariable mit dem Namen
FOO
:Beachten Sie, dass dies
$null
verwendet wird, um die Absicht , die Variable zu entfernen , besser zu signalisieren. Technisch gesehen entspricht dies jedoch''
in diesem Fall der Übergabe .So entfernen Sie a Systemumgebungsvariable (auf Maschinenebene) mit dem Namen
FOO
- Erhöhung erforderlich (muss als Administrator ausgeführt werden):Neben der schnelleren Ausführung der Vorteil gegenüber der
reg.exe
-basierten Methode dass andere Anwendungen über eineWM_SETTINGCHANGE
Nachricht über die Änderung informiert werden (obwohl nicht alle Anwendungen diese Nachricht abhören).quelle
Ich stimme CupawnTae zu .
SET
ist nicht nützlich für Änderungen an der Master-Umgebung.Zu Ihrer Information: Systemvariablen sind in
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
(viel länger als Benutzervariablen).Der vollständige Befehl für eine Systemvariable mit dem Namen FOOBAR lautet daher:
(Beachten Sie die Anführungszeichen, die für die Bearbeitung des Leerzeichens erforderlich sind.)
Es ist schade das
setx
Befehl keine Löschsyntax unterstützt. :((PS: Verantwortungsbewusst verwenden - Wenn Sie Ihre Pfadvariable töten, beschuldigen Sie mich nicht!
quelle
Der Befehl in DougWares Antwort funktionierte nicht, aber dies tat:
Die Verknüpfung
HKLM
kann für verwendet werdenHKEY_LOCAL_MACHINE
.quelle
Löschen ohne Neustart
Die Frage des OP wurde in der Tat ausführlich beantwortet, einschließlich der Frage, wie ein Neustart durch Powershell, VBScript oder Ihren Namen vermieden werden kann.
Wenn Sie sich jedoch nur an cmd-Befehle halten müssen und nicht den Luxus haben, Powershell oder VBScript aufrufen zu können, können Sie den folgenden Ansatz verwenden:
Die Magie hier ist also, dass Sie durch die Verwendung von "setx", um einer nicht benötigten Variablen etwas zuzuweisen (in meinem Beispiel DUMMY), Explorer.exe zwingen, die Variablen aus der Registrierung erneut zu lesen, ohne Powershell zu benötigen. Sie bereinigen dann diesen Dummy, und obwohl dieser noch eine Weile in der Explorer-Umgebung bleibt, wird er wahrscheinlich niemandem schaden.
Oder wenn Sie nach dem Löschen von Variablen neue festlegen müssen, benötigen Sie nicht einmal einen Dummy. Wenn Sie nur SETX verwenden, um die neuen Variablen festzulegen, werden diejenigen, die Sie gerade entfernt haben, automatisch aus allen neuen cmd-Aufgaben gelöscht, die möglicherweise gestartet werden.
Hintergrundinformationen: Ich habe diesen Ansatz gerade erfolgreich verwendet, um eine Reihe von Benutzervariablen durch gleichnamige Systemvariablen auf allen Computern in meinem Job zu ersetzen, indem ich ein vorhandenes cmd-Skript geändert habe. Es gibt zu viele Computer, um dies manuell zu tun, und es war auch nicht praktisch, zusätzliche Powershell- oder VBScripts auf alle zu kopieren. Der Grund, warum ich den Benutzer dringend durch Systemvariablen ersetzen musste, war, dass Benutzervariablen in Roaming-Profilen synchronisiert wurden (ich habe nicht darüber nachgedacht), sodass mehrere Computer, die dieselbe Windows-Anmeldung verwenden, aber unterschiedliche Werte benötigen, verwechselt wurden.
quelle
bewirkt nur, dass der Wert von FOOBAR eine Nullzeichenfolge ist. (Obwohl es mit dem
set
Befehl mit dem "" angezeigt wird, ist die Zeichenfolge möglicherweise in doppelten Anführungszeichen.)Ich benutzte:
und dann wurde FOOBAR nicht mehr im Befehl set aufgeführt. (Abmelden war nicht erforderlich.)
Windows 7 32-Bit, über die Eingabeaufforderung, Nicht-Administrator ist das, was ich verwendet habe. (Nicht cmd oder Windows+ R, was möglicherweise anders ist.)
Übrigens habe ich die Variable, die ich erstellt habe, nirgendwo in der Registrierung gesehen, nachdem ich sie erstellt habe. Ich verwende RegEdit nicht als Administrator.
quelle
Sie können auch ein kleines VBScript- Skript erstellen :
Dann nenne es wie
%windir%\System32\cscript.exe //Nologo "script_name.vbs" FOOBAR
.Der Nachteil ist, dass Sie ein zusätzliches Skript benötigen, aber keinen Neustart benötigen.
quelle