wake-up-neo.net

Befehlszeile zum Entfernen einer Umgebungsvariablen aus der Konfiguration auf Betriebssystemebene

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:

foobar

Wie würden Sie die Variable tatsächlich entfernen?

146
anon

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.

168
CupawnTae

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.

72
Brian Kelly

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.

  1. Speichern Sie das PowerShell-Skript in einer Datei (wir nennen es updateenv.ps1).
  2. Führen Sie dies über die Befehlszeile aus: reg delete "HKCU\Environment"/v FOO/f
  3. Führen Sie updateenv.ps1 aus.
  4. Schließen Sie die Eingabeaufforderung und öffnen Sie sie erneut. Sie werden feststellen, dass die Umgebungsvariable nicht mehr definiert ist.

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.

18
Jamie

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!

13
DougWare

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.

11
user4297498

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).

9
mklement0
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.

2
PReinie

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.

0