Это было рассмотрено довольно много, но есть важная часть информации, которая отсутствует. Надеюсь, я смогу помочь разобраться, как это работает, и немного облегчить усталых путешественников. :-)
Удалить из текущего процесса
Очевидно, что все знают, что вы просто делаете это, чтобы удалить переменную окружения из вашего текущего процесса:
set FOO=
Постоянное удаление
Существует два набора переменных среды: общесистемные и пользовательские.
Удалить переменную среды пользователя:
reg delete "HKCU\Environment" /v FOO /f
Удалить общесистемную переменную среды:
REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOO
Применить значение без перезагрузки
Вот волшебная информация, которой не хватает! Вы задаетесь вопросом, почему после того, как вы это сделаете, когда вы запускаете новое командное окно, переменная окружения все еще там. Причина в том, что explorer.exe не обновил свою среду. Когда один процесс запускает другой, новый процесс наследует среду от процесса, который его запустил.
Есть два способа исправить это без перезагрузки. Самый грубый способ - убить процесс explorer.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-fu для вас.