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:
set FOO=
Dauerhaftes Löschen
Es gibt zwei Sätze von Umgebungsvariablen, systemweit und Benutzer.
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 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 :
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 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.
- Speichern Sie das PowerShell-Skript in einer Datei (wir nennen es updateenv.ps1).
- Führen Sie dies über die Befehlszeile aus: reg delete "HKCU \ Environment" / v FOO / f
- Führen Sie updateenv.ps1 aus.
- 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. Ich lasse dies jedoch als Google-Fu-Übung für Sie.