这已经涉及了很多,但是缺少一条重要的信息。希望我能帮助弄清楚这是如何工作的,并为疲惫的旅行者提供一些缓解。 :-)
从当前进程中删除
显然,每个人都知道你这样做只是为了从当前进程中删除一个环境变量:
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 进程并重新启动它。您可以通过Task Manager 执行此操作。但是,我不推荐这种方法。
另一种方法是告诉 explorer.exe 环境已经改变,它应该重新读取它。这是通过广播 Windows 消息 (WM_SETTINGCHANGE) 来完成的。这可以通过一个简单的 PowerShell 脚本来完成。您可以轻松编写一个来执行此操作,但我在 Update Window Settings After Scripted Changes 中找到了一个:
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 练习留给您。强>