【发布时间】:2010-12-01 03:48:10
【问题描述】:
我需要从客户端工作站中删除系统变量。我有 500 多个客户端,所以我想提供批处理文件给用户自己运行以删除系统变量。
【问题讨论】:
标签: windows batch-file environment-variables
我需要从客户端工作站中删除系统变量。我有 500 多个客户端,所以我想提供批处理文件给用户自己运行以删除系统变量。
【问题讨论】:
标签: windows batch-file environment-variables
您将需要修改此注册表项:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
重启后更改生效。
【讨论】:
如果你想避免重启,你会想办法在删除值后向每个活动窗口广播WM_SETTINGSCHANGE。
这将使新的 CMD 窗口注意到变量已被删除(以及任何其他理解 WM_SETTNGSCHANGE 的程序)。
【讨论】:
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 谈论 name(a) 具有 value(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 知识库文章 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% 因此变量消失了。现在注册表中有一些不必要的垃圾。
user 提出了一个有趣的观点,即现在当您尝试设置系统范围的变量时,它不起作用。因为它被用户变量中的内容覆盖,在这种情况下,它总是以未定义的形式出现。
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 命令不会删除它。这不仅仅是吹毛求疵,因为逻辑完全不同。因为如果用户特定变量覆盖全局变量,则无法删除用户特定变量并使全局变量再次“变为活动状态”。空字符串用户特定变量会阻塞全局变量。需要实际DELETE它(使用环境变量窗口)来实现这一点。
我今天刚刚尝试过,全局变量 JAVA_HOME 被用户特定的 JAVA_HOME 覆盖。如果不完全删除用户特定变量,就不可能再次激活全局变量。到目前为止,我还没有看到从命令行或批处理脚本中执行此操作的方法。
(没有足够的声誉点来为上面关于setx的答案添加评论,所以必须添加我自己的答案......)
【讨论】: