我需要从客户端工作站中删除系统变量。我有500多个客户端,所以我想提供一个批处理文件给用户自己运行来删除系统变量。
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 这么说 “注册表值是存储在键中的名称/数据对” 谈论名称/数据对。 name(a) data(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 提示符而言,变量已经消失了。 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 。
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,以便它也为当前会话设置不仅仅是下一张。还有一个链接 setx 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
的程序)。