如何使用batch file从系统configuration中删除环境variables

我需要从客户端工作站中删除系统variables。 我有500多个客户,所以我想提供batch file给用户运行自己删除系统variables。

Solutions Collecting From Web of "如何使用batch file从系统configuration中删除环境variables"

You may want to make these two permanent with setx but obviously no need to C:\>set uvar=HKCU\Environment C:\> C:\>set mvar=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment C:\> 

一些术语
在一个密钥(就像一个文件夹)内,你有一个像a = 5的数据的变量

http://msdn.microsoft.com/en-us/library/3dwk5axy.aspx谈到名称(a)有一个值(5)。

注册表术语在msdn上看起来有些不同,但reg.exe和wikipedia似乎一致。 维基百科http://en.wikipedia.org/wiki/Windows_Registry这样说:“注册表值是存储在密钥中的名称/数据对”对话的名称/数据对。 名字(a)数据(5)和这个对一起是一个值。

REG似乎使用/ v这可能是指变量名称及其数据(如在维基百科),它确实显示变量名称及其数据。 而REG有一个我认为只是数据的d。

以setx为例

  C:\>reg query %uvar% HKEY_CURRENT_USER\Environment TEMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp TMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp ... C:\>setx aaa 3 C:\>reg query %uvar% HKEY_CURRENT_USER\Environment TEMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp TMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp ... aaa REG_SZ 3 

如果您尝试使用setx删除它,那么您可以得到的最接近的是清除它作为这个MS知识库文章这个MS知识库文章195050说,哪些让你仍然在注册表中。

setx不从注册表中删除该变量

 C:\>setx aaa "" SUCCESS: Specified value was saved. C:\>reg query %uvar% HKEY_CURRENT_USER\Environment TEMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp TMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp ... aaa REG_SZ C:\> 

不过值得注意的是,就cmd提示符而言,变量已经消失了。 回声%aaa%将显示%aaa%,所以变量不见了。 现在注册表中只有一些不必要的垃圾。

用户提出了一个有趣的观点,那就是现在当你尝试设置一个系统变量时,它不起作用。 因为它被用户变量中的内容覆盖,在这种情况下,它总是会以未定义的方式出现。

 C:\>reg delete %uvar% /v aaa Delete the registry value aaa (Yes/No)? y The operation completed successfully. C:\> 

请注意,aaa现在不见了。 下面。

 C:\>reg query %uvar% HKEY_CURRENT_USER\Environment TEMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp TMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp ... C:\> 

如果你想做一个系统/机器环境变量而不是一个用户。

– 下面的行必须来自管理特权cmd提示符
注意关键是HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment
– %mvar%(不同于%uvar%)需要引号围绕它,因为密钥在其中有一个空格。 如果你错过了报价,这是没有什么大不了的,你只是得到一个错误,可能会提醒你使用引号。
– 当然,如果你想用setx在注册表的那一部分设置一个环境变量,使用例如setx aaa 5 -m即-m之后。

 C:\>set mvar=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment C:\>reg delete "%mvar%" /v aaa Delete the registry value aaa (Yes/No)? y The operation completed successfully. C:\> 

进一步说明
您可以使用REG ADD或REG DELETE创建一个环境变量(取代setx),但无论如何,在设置变量时,您也可以使用set,以便为当前会话设置变量不只是下一个。 和一个链接重新建立https://superuser.com/questions/647505/set-enviroment-variable-setx

带有空字符串值的setx命令不会将其删除。 这不仅仅是挑剔,因为逻辑是完全不同的。 因为如果用户特定变量覆盖全局变量,则不可能删除用户特定的变量并使全局变量再次变为“活动”。 空字符串用户特定变量阻止全局变量。 一个需要实际删除 (使用环境变量窗口)来实现。

我今天刚刚尝试过,全局变量JAVA_HOME被用户特定的JAVA_HOME覆盖。 不能完全删除用户特定的变量,使全局变量无法再次激活。 到目前为止,我还没有看到从命令行或批处理脚本执行该操作的方法。

(没有足够的声望点添加评论上面的答案关于setx,所以不得不添加我自己的答案…)

您将需要修改此注册表项:

HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment

重新启动后更改生效。

如果您想避免重新启动,您将找到一种方法来将WM_SETTINGSCHANGE广播到每个活动窗口后删除值。

这将使新的CMD窗口注意到该变量已被删除(以及任何其他理解WM_SETTNGSCHANGE程序)。