Omówiono to sporo, ale brakuje kluczowej informacji. Mam nadzieję, że pomogę wyjaśnić, jak to działa i przynieść ulgę zmęczonym podróżnikom. :-)
Usuń z bieżącego procesu
Oczywiście wszyscy wiedzą, że robisz to po prostu, aby usunąć zmienną środowiskową z bieżącego procesu:
set FOO=
Trwałe usuwanie
Istnieją dwa zestawy zmiennych środowiskowych, ogólnosystemowe i użytkownika.
Usuń zmienną środowiska użytkownika:
reg delete "HKCU\Environment" /v FOO /f
Usuń ogólnosystemową zmienną środowiskową:
REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOO
Zastosuj wartość bez ponownego uruchamiania
Oto magiczne informacje, których brakuje! Zastanawiasz się, dlaczego po wykonaniu tej czynności, kiedy uruchamiasz nowe okno poleceń, zmienna środowiskowa nadal tam jest. Powodem jest to, że program explorer.exe nie zaktualizował swojego środowiska. Gdy jeden proces uruchamia inny, nowy proces dziedziczy środowisko po procesie, który go uruchomił.
Istnieją dwa sposoby rozwiązania tego problemu bez ponownego uruchamiania. Najbardziej brutalnym sposobem jest zabicie procesu explorer.exe i ponowne jego uruchomienie. Możesz to zrobić w Menedżerze zadań . Nie polecam jednak tej metody.
Innym sposobem jest poinformowanie programu explorer.exe, że środowisko się zmieniło i że powinien je ponownie przeczytać. Odbywa się to poprzez rozgłaszanie wiadomości Windows (WM_SETTINGCHANGE). Można to osiągnąć za pomocą prostego skryptu PowerShell. Możesz łatwo napisać taki, aby to zrobić, ale znalazłem go w ustawieniach okna aktualizacji po zmianach skryptowych :
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);
Podsumowanie
Aby więc usunąć zmienną środowiskową użytkownika o nazwie „FOO” i odzwierciedlić zmianę w procesach uruchamianych później, wykonaj następujące czynności.
- Zapisz skrypt PowerShell w pliku (nazwiemy go updateenv.ps1).
- Zrób to z wiersza poleceń: reg delete „HKCU \ Environment” / v FOO / f
- Uruchom updateenv.ps1.
- Zamknij i ponownie otwórz wiersz polecenia, a zobaczysz, że zmienna środowiskowa nie jest już zdefiniowana.
Uwaga, prawdopodobnie będziesz musiał zaktualizować ustawienia PowerShell, aby umożliwić uruchomienie tego skryptu, ale zostawię to jako ćwiczenie Google-fu.