Про це було висвітлено небагато, але є важлива інформація, якої бракує. Сподіваюсь, я можу допомогти з’ясувати, як це працює, і надати трохи полегшення втомленим мандрівникам. :-)
Видалити з поточного процесу
Очевидно, всі знають, що ви просто робите це, щоб видалити змінну середовища з вашого поточного процесу:
set FOO=
Постійне видалення
Існує два набори змінних середовища, загальносистемні та користувацькі.
Видалити змінну середовища користувача:
reg delete "HKCU\Environment" /v FOO /f
Видалити змінну системної змінної середовища:
REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOO
Застосувати значення без перезавантаження
Ось магічна інформація, якої не вистачає! Вам цікаво, чому після цього, коли ви запускаєте нове вікно команд, змінна середовища все ще існує. Причина в тому, що explorer.exe не оновлював своє середовище. Коли один процес запускає інший, новий процес успадковує середовище від процесу, який його запустив.
Є два способи виправити це без перезавантаження. Найбільш грубий спосіб - це вбити процес explor.exe і запустити його заново. Це можна зробити з диспетчера завдань . Я не рекомендую цей метод.
Інший спосіб - сказати explorer.exe, що середовище змінилося і що слід його перечитати. Це робиться за допомогою трансляції повідомлення Windows (WM_SETTINGCHANGE). Це можна досягти за допомогою простого сценарію PowerShell. Ви можете легко написати один, щоб це зробити, але я знайшов його в Оновлення налаштувань вікна після сценаріїв змін :
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);
Підсумок
Отже, щоб видалити змінну середовища користувача з назвою "FOO" та зміни, відображені в процесах, які ви запускаєте після цього, виконайте наступне.
- Збережіть скрипт PowerShell у файл (ми його назвемо updateenv.ps1).
- Зробіть це з командного рядка: reg delete "HKCU \ Environment" / v FOO / f
- Запустіть updateenv.ps1.
- Закрийте та знову відкрийте командний рядок, і ви побачите, що змінна середовища більше не визначена.
Зауважте, вам, ймовірно, доведеться оновити налаштування PowerShell, щоб ви могли запустити цей сценарій, але це я залишу для вас як вправу Google-фу.