【问题标题】:How to remove an environment variable from the system configuration with a batch file如何使用批处理文件从系统配置中删除环境变量
【发布时间】:2010-12-01 03:48:10
【问题描述】:

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

【问题讨论】:

    标签: windows batch-file environment-variables


    【解决方案1】:

    您将需要修改此注册表项:

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

    重启后更改生效。

    【讨论】:

    • 我在 \HKEY_CURRENT_USER\Environment\ 中找到了我的 setx 环境设置。但是感谢您提供有关在注册表中查找位置的指针。奇怪的是,我不需要重新启动它来影响我打开的下一个 dos\cmd。很有趣。
    【解决方案2】:

    如果你想避免重启,你会想办法在删除值后向每个活动窗口广播WM_SETTINGSCHANGE

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

    【讨论】:

      【解决方案3】:
      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

      【讨论】:

        【解决方案4】:

        带有空字符串值的 setx 命令不会删除它。这不仅仅是吹毛求疵,因为逻辑完全不同。因为如果用户特定变量覆盖全局变量,则无法删除用户特定变量并使全局变量再次“变为活动状态”。空字符串用户特定变量会阻塞全局变量。需要实际DELETE它(使用环境变量窗口)来实现这一点。

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

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

        【讨论】:

          猜你喜欢
          • 2011-04-17
          • 2011-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-03
          • 2017-07-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多