如何使用批处理文件从系统配置中删除环境变量

问题描述 投票:0回答:4

我需要从客户端工作站中删除系统变量。我有500多个客户端,所以我想提供一个批处理文件给用户自己运行来删除系统变量。

windows batch-file environment-variables
4个回答
12
投票
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


5
投票

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

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

(没有足够的声誉点来添加评论到上面关于setx的答案,所以必须添加我自己的答案......)


4
投票

您需要修改此注册表项:

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

更改重启后生效。


0
投票

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

WM_SETTINGSCHANGE

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

WM_SETTNGSCHANGE
的程序)。

© www.soinside.com 2019 - 2024. All rights reserved.