2015-04-17 247 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