Windows有setx命令:

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

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

setx FOOBAR 1

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

setx FOOBAR ""

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

那么如何移除变量呢?


当前回答

不重启删除

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.

其他回答

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

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

要从当前命令会话中删除变量而不永久删除它,使用常规的内置set命令-在等号后面不放任何东西:

设置FOOBAR =

要确认,请执行不带参数的set命令并检查当前环境。该变量应该从列表中完全消失。

注意:这只会从当前环境中删除变量-它不会将更改保存到注册表中。当启动一个新的命令进程时,该变量将返回。

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

Remove-ItemProperty HKCU:\Environment FOOBAR

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

rm env:\FOOBAR

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

我同意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

不会有任何安排。