我需要从客户端工作站中删除系统变量。我有500多个客户端,所以我想向用户提供批处理文件以自行运行以删除系统变量。
答案 0 :(得分:11)
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:\>
一些术语
在一个Key(就像一个文件夹)中,你有一个带有一些数据的变量,比如a = 5
http://msdn.microsoft.com/en-us/library/3dwk5axy.aspx 谈论名称(a)具有值(5)。
注册表术语在msdn上看起来有点不同,但reg.exe和维基百科似乎一致。 维基百科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 KB文章this MS KB article 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提示而言,变量已经消失。 echo%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 after。
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,以便为当前会话设置它不只是下一个。还有一个链接re setx https://superuser.com/questions/647505/set-enviroment-variable-setx
答案 1 :(得分:4)
带有空字符串值的setx命令不会删除它。这不仅仅是挑剔,因为逻辑完全不同。因为如果用户特定变量覆盖全局变量,则无法删除特定于用户的变量并使全局变量再次“变为活动状态”。空字符串用户特定变量阻止全局变量。实际上需要实际 DELETE (使用Evironment Variables窗口)来实现它。
我今天就试过这个,全局变量JAVA_HOME被特定于用户的JAVA_HOME覆盖。如果不完全删除用户特定变量,则无法再次激活全局变量。到目前为止,我还没有看到从命令行或批处理脚本中执行此操作的方法。
(没有足够的声誉点来添加关于setx的上述答案的评论,所以必须添加我自己的答案......)
答案 2 :(得分:3)
您需要修改此注册表项:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
重新启动后更改生效。
答案 3 :(得分:0)
如果您想避免重启,您将找到一种方法,在删除值后,将WM_SETTINGSCHANGE
广播到每个活动窗口。
这将使新的CMD窗口注意到该变量已被删除(以及任何其他理解WM_SETTNGSCHANGE
的程序。)