Windows有setx命令:

Description:
    Creates or modifies environment variables in the user or system
    environment.

所以你可以这样设置一个变量:

setx FOOBAR 1

你可以像这样清除这个值:

setx FOOBAR ""

但是,该变量不会被删除。它保留在注册表中:

那么如何移除变量呢?


当前回答

在PowerShell中,删除注册表值的方法是使用Remove-ItemProperty cmdlet。在这种情况下,持久化值(用于将来的进程)被删除:

Remove-ItemProperty HKCU:\Environment FOOBAR

如果你想从当前环境中删除它,你可以像这样从Env: "drive"中删除它:

rm env:\FOOBAR

不能使用SETX.exe来执行此操作。

其他回答

在PowerShell中,您可以使用.NET [System.Environment]::SetEnvironmentVariable()方法:

删除名为FOO的用户环境变量。 [Environment]::SetEnvironmentVariable('FOO', $null, 'User')

注意,$null用于更好地表示删除变量的意图,尽管在这种情况下,从技术上讲,它实际上与传递''相同。

要删除名为FOO -的系统(机器级)环境变量,需要提升(必须以管理员身份运行): [Environment]::SetEnvironmentVariable('FOO', $null, 'Machine')

除了更快的执行速度外,与基于reg.exe的方法相比,它的优点是其他应用程序会通过WM_SETTINGCHANGE消息得到更改通知——虽然很少有应用程序会真正侦听该消息并更新它们的环境作为响应,但Windows (GUI) shell会,因此随后通过文件资源管理器/从桌面/任务栏/开始菜单启动的应用程序会看到更新后的环境。

这一点已经被讨论了很多,但是有一个关键的信息被遗漏了。希望我能帮你弄清楚这是如何运作的,并给疲惫的旅行者一些安慰。: -)

从当前进程删除

显然,每个人都知道这样做只是为了从当前进程中删除一个环境变量:

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练习留给您。

从当前环境中删除变量(不是永久地):

set FOOBAR=

要永久地从用户环境中删除变量(这是setx放置它的默认位置):

REG delete HKCU\Environment /F /V FOOBAR

如果变量是在系统环境中设置的(例如,如果您最初使用setx /M设置它),作为管理员运行:

REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR

注意:上面的REG命令不会影响任何现有进程(以及从现有进程中派生出来的一些新进程),因此,如果更改对立即生效很重要,那么最简单、最可靠的方法就是注销并重新登录或重新启动。如果这不是一个选择,或者您想深入挖掘,这里的一些其他答案有一些很好的建议,可能适合您的用例。

DougWare回答中的命令并没有起作用,但这个却起了作用:

reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v FOOBAR /f

快捷方式HKLM可用于HKEY_LOCAL_MACHINE。

setx FOOBAR ""

只是导致FOOBAR的值为空字符串。(虽然,它显示的是带有""的set命令,所以可能双引号是字符串。)

我使用:

set FOOBAR=

然后FOOBAR就不再列在set命令中了。(不需要注销。)

Windows 7 32位,使用命令提示符,非管理员是我使用的。(不是cmd或Windows + R,这可能是不同的。)

顺便说一句,我没有看到我在注册表的任何地方创建的变量,我创建了它。我使用RegEdit而不是管理员。