Windows hat den Befehl setx
:
Description:
Creates or modifies environment variables in the user or system
environment.
So können Sie eine Variable wie folgt festlegen:
setx FOOBAR 1
Und Sie können den Wert wie folgt löschen:
setx FOOBAR ""
Die Variable wird jedoch nicht entfernt. Es bleibt in der Registrierung:
Wie würden Sie die Variable tatsächlich entfernen?
So entfernen Sie die Variable aus der aktuellen Umgebung ( nicht dauerhaft):
set FOOBAR=
So entfernen Sie die Variable dauerhaft aus der Benutzerumgebung (dies ist der Standardort, den setx
verwendet):
REG delete HKCU\Environment /F /V FOOBAR
Wenn die Variable in der Systemumgebung festgelegt ist (z. B. wenn Sie sie ursprünglich mit setx /M
Festgelegt haben), führen Sie als Administrator Folgendes aus:
REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR
Hinweis: Die obigen REG
- 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, Möglicherweise möchten Sie sich abmelden und wieder anmelden oder neu starten.
Verwenden Sie den regulären integrierten Befehl set
, um die Variable aus der aktuellen Befehlssitzung zu entfernen, ohne sie dauerhaft zu entfernen. Fügen Sie nach dem Gleichheitszeichen einfach nichts ein:
set FOOBAR=
Führen Sie zur Bestätigung set
ohne Argumente aus und überprüfen Sie die aktuelle Umgebung. Die Variable sollte vollständig in der Liste fehlen.
Hinweis : Hiermit wird nur die Variable aus der aktuellen Umgebung entfernt wird die Änderung an der Registrierung nicht beibehalten. Wenn ein neuer Befehlsprozess gestartet wird, ist die Variable zurück.
Dies wurde ziemlich viel abgedeckt, aber es gibt eine wichtige Information, die fehlt. Hoffentlich kann ich helfen, die Funktionsweise zu klären und müden Reisenden Erleichterung zu verschaffen. :-)
Aus aktuellem Prozess löschen
Natürlich weiß jeder, dass Sie dies nur tun, um eine Umgebungsvariable aus Ihrem aktuellen Prozess zu löschen:
set FOO=
Dauerhaftes Löschen
Es gibt zwei Gruppen von Umgebungsvariablen, systemweit und benutzerweit.
Benutzerumgebungsvariable löschen:
reg delete "HKCU\Environment" /v FOO /f
Systemweite Umgebungsvariable löschen:
REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOO
Wert ohne Neustart übernehmen
Hier ist die magische Information, die fehlt! 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 einen Neustart durchzuführen. Der brachialste Weg ist, den Explorer.exe-Prozess zu beenden und erneut zu starten. Sie können dies mit Task-Manager tun. Ich empfehle diese Methode jedoch nicht.
Die andere Möglichkeit 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 fand eine in pdate Window Settings After Scripted Changes:
if (-not ("win32.nativemethods" -as [type])) {
add-type -Namespace Win32 -Name NativeMethods -MemberDefinition @"
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr SendMessageTimeout(
IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam,
uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);
"@
}
$HWND_BROADCAST = [intptr]0xffff;
$WM_SETTINGCHANGE = 0x1a;
$result = [uintptr]::zero
[win32.nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE,[uintptr]::Zero, "Environment", 2, 5000, [ref]$result);
Zusammenfassung
Gehen Sie folgendermaßen vor, um eine Benutzerumgebungsvariable mit dem Namen "FOO" zu löschen und die Änderung in den Prozessen widerzuspiegeln, die Sie anschließend starten.
Beachten Sie, dass Sie wahrscheinlich Ihre PowerShell-Einstellungen aktualisieren müssen, damit Sie dieses Skript ausführen können, aber ich werde das als Google-Fu-Übung für Sie belassen.
Ich stimme zu mit CupawnTae .
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 user vars).
Der vollständige Befehl für eine Systemvariable namens FOOBAR lautet daher:
REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR
(Beachten Sie die Anführungszeichen, die für den Umgang mit dem Platz erforderlich sind.)
Schade, dass der Befehl setx
keine Löschsyntax unterstützt. :(
PS: Verwenden Sie verantwortungsbewusst - Wenn Sie Ihre Pfadvariable töten, beschuldigen Sie mich nicht!
Der Befehl in DougWares Antwort hat nicht funktioniert, aber das hat:
reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v FOOBAR /f
Die Verknüpfung HKLM
kann für HKEY_LOCAL_MACHINE
Verwendet werden.
In PowerShell können Sie die .NET [System.Environment]::SetEnvironmentVariable()
-Methode verwenden:
Um eine user Umgebungsvariable mit dem Namen FOO
zu entfernen:
[Environment]::SetEnvironmentVariable('FOO', $null, 'User')
Beachten Sie, dass $null
wird verwendet, um die Absicht zum remove der Variablen besser zu signalisieren, obwohl es technisch praktisch das Gleiche ist wie das Übergeben von ''
in diesem Fall.
Zum Entfernen einer System (Maschinenebene) Umgebungsvariablen mit dem Namen FOO
- erfordert eine Erhöhung (muss als Administrator ausgeführt werden):
[Environment]::SetEnvironmentVariable('FOO', $null, 'Machine')
Abgesehen von der schnelleren Ausführung ist der Vorteil gegenüber dem reg.exe
- basierte Methode ist, dass andere Anwendungen über die Änderung informiert werden , über ein WM_SETTINGCHANGE
message (obwohl nicht alle Anwendungen diese Nachricht abhören).
setx FOOBAR ""
bewirkt nur, dass der Wert von FOOBAR eine Nullzeichenfolge ist. (Obwohl es mit dem Befehl "" set
angezeigt wird, ist die Zeichenfolge möglicherweise doppelte Anführungszeichen.)
Ich benutzte:
set FOOBAR=
und dann wurde FOOBAR nicht mehr im Befehl set aufgeführt. (Abmelden war nicht erforderlich.)
Windows 7 32-Bit, mit dem Befehl Eingabeaufforderung, Nicht-Administrator ist das, was ich verwendet habe. (Nicht cmd oder Windows + R, die unterschiedlich sein könnten.)
Übrigens habe ich die Variable, die ich irgendwo in der Registrierung erstellt habe, nicht gesehen, nachdem ich sie erstellt habe. Ich benutze RegEdit nicht als Administrator.
Sie können auch ein kleines VBScript Skript erstellen:
Set env = CreateObject("WScript.Shell").Environment("System")
If env(WScript.Arguments(0)) <> vbNullString Then env.Remove WScript.Arguments(0)
Dann nenne es wie %windir%\System32\cscript.exe //Nologo "script_name.vbs" FOOBAR
.
Der Nachteil ist, dass Sie ein zusätzliches Skript benötigen, das jedoch keinen Neustart erfordert.