이것은 상당히 다루어졌지만 중요한 정보가 빠져 있습니다. 바라건대, 나는 이것이 어떻게 작동하는지 정리하고 지친 여행자에게 약간의 구호를 줄 수 있습니다. :-)
현재 프로세스에서 삭제
분명히 모든 사람은 현재 프로세스에서 환경 변수를 삭제하기 위해이 작업을 수행한다는 것을 알고 있습니다.
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을위한 연습으로 남겨 두겠습니다.