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

时间:2009-09-24 16:15:39

标签: windows batch-file environment-variables

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

4 个答案:

答案 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的程序。)