Windows有setx命令:

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

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

setx FOOBAR 1

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

setx FOOBAR ""

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

那么如何移除变量呢?


当前回答

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

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

快捷方式HKLM可用于HKEY_LOCAL_MACHINE。

其他回答

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

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

快捷方式HKLM可用于HKEY_LOCAL_MACHINE。

我同意CupawnTae的观点。

SET对于更改主环境没有用处。

供您参考:系统变量在HKLM\ System \CurrentControlSet\Control\Session Manager\Environment中(比用户变量长很多)。

因此,一个名为FOOBAR的系统变量的完整命令是:

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

(请注意处理空格所需的引号。)

可惜setx命令不支持删除语法。:(

PS:负责任地使用-如果你杀死了你的路径变量,不要怪我!

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

设置FOOBAR =

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

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

顺便说一下,我刚刚算出了如何用setx取消设置的永久变量。

简单地写引号,比如:

setx myvar ""

并在下一个cmd窗口重新启动,如果你搜索变量

set myvar

不会有任何安排。

不重启删除

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.