Windows有setx命令:
Description:
Creates or modifies environment variables in the user or system
environment.
所以你可以这样设置一个变量:
setx FOOBAR 1
你可以像这样清除这个值:
setx FOOBAR ""
但是,该变量不会被删除。它保留在注册表中:
那么如何移除变量呢?
Windows有setx命令:
Description:
Creates or modifies environment variables in the user or system
environment.
所以你可以这样设置一个变量:
setx FOOBAR 1
你可以像这样清除这个值:
setx FOOBAR ""
但是,该变量不会被删除。它保留在注册表中:
那么如何移除变量呢?
当前回答
从当前环境中删除变量(不是永久地):
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命令不会影响任何现有进程(以及从现有进程中派生出来的一些新进程),因此,如果更改对立即生效很重要,那么最简单、最可靠的方法就是注销并重新登录或重新启动。如果这不是一个选择,或者您想深入挖掘,这里的一些其他答案有一些很好的建议,可能适合您的用例。
其他回答
我同意CupawnTae的观点。
SET对于更改主环境没有用处。
供您参考:系统变量在HKLM\ System \CurrentControlSet\Control\Session Manager\Environment中(比用户变量长很多)。
因此,一个名为FOOBAR的系统变量的完整命令是:
REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR
(请注意处理空格所需的引号。)
可惜setx命令不支持删除语法。:(
PS:负责任地使用-如果你杀死了你的路径变量,不要怪我!
顺便说一下,我刚刚算出了如何用setx取消设置的永久变量。
简单地写引号,比如:
setx myvar ""
并在下一个cmd窗口重新启动,如果你搜索变量
set myvar
不会有任何安排。
在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会,因此随后通过文件资源管理器/从桌面/任务栏/开始菜单启动的应用程序会看到更新后的环境。
不重启删除
OP的问题确实已经得到了广泛的回答,包括如何避免通过powershell、vbscript或任何你能想到的重新启动。
然而,如果你需要坚持只使用cmd命令,并且没有能够调用powershell或vbscript的奢侈,你可以使用以下方法:
rem remove from current cmd instance
SET FOOBAR=
rem remove from the registry if it's a user variable
REG delete HKCU\Environment /F /V FOOBAR
rem remove from the registry if it's a system variable
REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR
rem tell Explorer.exe to reload the environment from the registry
SETX DUMMY ""
rem remove the dummy
REG delete HKCU\Environment /F /V DUMMY
所以这里的神奇之处在于,通过使用“setx”将一些东西分配给一个你不需要的变量(在我的例子中是DUMMY),你可以强制Explorer.exe从注册表中重新读取变量,而不需要powershell。然后你清理这个假人,尽管它会在“探索者”的环境中停留一段时间,但它可能不会伤害任何人。
或者如果在删除变量后你需要设置新的变量,那么你甚至不需要任何dummy。只要使用SETX来设置新变量,就会自动清除你刚刚从任何可能启动的新cmd任务中删除的那些变量。
Background information: I just used this approach successfully to replace a set of user variables by system variables of the same name on all of the computers at my job, by modifying an existing cmd script. There are too many computers to do it manually, nor was it practical to copy extra powershell or vbscripts to all of them. The reason I urgently needed to replace user with system variables was that user variables get synchronized in roaming profiles (didn't think about that), so multiple machines using the same windows login but needing different values, got mixed up.
DougWare回答中的命令并没有起作用,但这个却起了作用:
reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v FOOBAR /f
快捷方式HKLM可用于HKEY_LOCAL_MACHINE。