Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何使用批处理文件从系统配置中删除环境变量_Windows_Batch File_Environment Variables - Fatal编程技术网

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

Windows 如何使用批处理文件从系统配置中删除环境变量,windows,batch-file,environment-variables,Windows,Batch File,Environment Variables,我需要从客户端工作站删除系统变量。我有500多个客户端,因此我想向用户提供批处理文件,以便用户自己运行以删除系统变量。您需要修改此注册表项: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment 更改在重新启动后生效。带有空字符串值的setx命令不会删除它。这不仅仅是吹毛求疵,因为逻辑是完全不同的。因为如果特定于用户的变量覆盖了全局变量,那么就不可能删除特定于用户的变量并使全局变量再次“激

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

您需要修改此注册表项:

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

更改在重新启动后生效。

带有空字符串值的setx命令不会删除它。这不仅仅是吹毛求疵,因为逻辑是完全不同的。因为如果特定于用户的变量覆盖了全局变量,那么就不可能删除特定于用户的变量并使全局变量再次“激活”。空字符串用户特定变量阻止全局变量。需要实际删除它(使用环境变量窗口)才能实现这一点

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

(没有足够的声誉点数来对上述关于setx的答案添加评论,因此必须添加我自己的答案…)

一些术语
在一个键(类似于文件夹)中,有一个变量包含一些数据,如a=5

谈论名称(a)具有值(5)

msdn上的注册表术语看起来有点不同,但reg.exe和wikipedia似乎是一致的。 维基百科是这么说的 “注册表值是存储在注册表项中的名称/数据对” 谈论名称/数据对。名称(a)数据(5)和一对一起作为一个值

REG似乎使用/v,它可能同时引用变量名及其数据(如在维基百科中),但它同时显示变量名及其数据。REG有a/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删除它,最接近的方法就是清除它,正如这篇mskb文章所说的那样,这将使您的注册表中仍然保留它

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提示符而言,变量已经消失了。回显%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,以便为当前会话而不是下一个会话设置该变量。如果要避免重新启动,您需要找到一种方法,在删除值后,向每个活动窗口广播一个
WM\u SETTINGSCHANGE


这将使新的CMD windows注意到该变量已被删除(以及理解
WM\u SETTNGSCHANGE
)的任何其他程序。

我在\HKEY\u CURRENT\u USER\environment\中找到了我的setx环境设置。但是,感谢您提供了在注册表中查找位置的指针。奇怪的是,我不需要重新启动它就可以影响我打开的下一个dos\cmd。有趣。
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:\>