2015-04-17 263 views
2

为什么在Windows 7 Professional中使用reg delete HKCU\Environment /F /V TestVar删除环境变量会将其从注册表中删除,但该变量仍存在?删除环境变量不起作用

下面是详细信息:我创建了以下3个.cmd文件:

检查variable.cmd

echo TestVar = %TestVar% 
pause 

集variable.cmd

setx TestVar 123 
pause 

删除变量.cmd

reg delete HKCU\Environment /F /V TestVar 
pause 

然后我请按照下列步骤操作(双击以确保我每次开始一个新的会话):

  1. Check variable.cmd双击我看到TestVar不存在
  2. 双点击Set variable.cmd,它说SUCCESS: Specified value was saved.
  3. 双击Check variable.cmd它显示变量值。好!在Delete variable.cmd
  4. 双击和它说Check variable.cmdThe operation completed successfully.
  5. 双击它仍然显示变量值。坏!
  6. 单击开始菜单,键入environment,点击Edit environment variables for your account打开Environment Variables对话框中,单击OK不做改变
  7. Check variable.cmd双击和变量不存在了

我能找到在步骤2后注册表中的值在步骤4后找不到它,但步骤5仍然可以找到它。即使我没有改变任何东西,第6步真的会删除变量。

+2

您必须广播一条消息来通知应用程序(在本例中为Windows资源管理器)的更改。请参阅http://stackoverflow.com/a/5246097/886887 –

+0

@HarryJohnston:如何从批处理文件中广播消息? – stenci

回答

2

这是我的问题的解决方案。我不知道这是否是正确的解决方案,但它为我工作:

检查variable.cmd

set TestVar 
@pause 

集variable.cmd

setx TestVar 123 
@pause 

删除variable.cmd

reg delete HKCU\Environment /F /V TestVar 
setx DummyVarUsedToDelete "" 
reg delete HKCU\Environment /F /V DummyVarUsedToDelete 
@pause 

setx不能用于删除变量,如解释here所示,但它在执行reg delete从注册表中删除变量后会丢失广播。

编辑

我添加了一行从注册表中删除DummyVarUsedToDelete。这不会被播出,但这是一个小问题。

+1

请注意,该解决方案留下了注册表中“DummyVarUsedToDelete”的空条目,该条目可能会被删除。 –

0

在引导时读取注册表。当一个程序启动时,它会得到它父母的环境副本,通常是Explorer.exe的环境。

正如评论所说,如果浏览器(或任何其他图形程序,作用于该消息),如果它从其他程序(如setx)收到一条消息,警告它注册表已被更改,重新读取注册表。

答案是连续的线条简单

使用setsetx

+1

问题在于删除,而不是在集合上。它看起来像'setx'完成它的工作,并通知Explorer.exe。问题是'reg delete'完成了它的工作,但是没有通知Explorer.exe – stenci

1

您可以使用setx删除一个环境变量,这将播出正确的消息:

setx TestVar "" 
reg delete HKCU\Environment /F /V TestVar 

(就其本身在评论中讨论的那样,使用setx会在注册表中后面留下一个空项,其中为了保持一致性应删除。)

+0

从https://technet.microsoft.com/en-us/library/cc755104.aspx:您无法使用setx命令删除值已添加到本地或系统环境中。您可以使用带有变量名称和无值的set来从本地环境中删除相应的值。 – stenci

+0

适合我。我怀疑部分文档已过时。 –

+0

它将变量值从“”更改为“”,但不会删除该变量。通常,空字符串与不存在的变量具有相同的效果,但我想将其删除 – stenci