2010-09-20 102 views
2

我試圖查詢特定的註冊表文件夾(或任何你想要調用它)來獲取一些信息。通過批處理語法查詢Windows註冊表

特別是HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall文件夾包含已安裝軟件的列表。

問題是,每個軟件都是通過一個隨機的鍵值,如{0001B4FD-9EA3-4D90-A79E-FD14BA3AB01D}而不是實際的軟件(如Skype)來識別的。

這使得它很難找到Skype標識符,因爲我通過一切需要循環這一Uninstall文件夾內,並檢查DisplayName值是否對應於Skype(或任何其他應用程序的名稱)。

我需要使用批處理語法...這是我迄今爲止,但它在不同的計算機上表現不一樣,也許我根據reg輸出的一些錯誤格式獲得不同的變量分配?我不知道。我可以使用數據結構來包含任何reg輸出嗎?任何事情都可以工作。

@echo off 
for /f "tokens=*" %%a in ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall') do (
    for /f "tokens=2,* delims= " %%b in ('reg query %%a /v Publisher') do (
     IF "%%c" == "Skype Technologies S.A." (
      for /f "tokens=2,* delims= " %%d in ('reg query %%a /v UninstallString') do (
       echo %%e 
      ) 
     ) 
    ) 

) 

是否有一個更清潔和更安全的方式來批量實現這一點?

+0

也許你最好在ServerFault上問這個問題。關於你的數據結構,只是把它寫到一個臨時文件是不夠的我假設?! – 2010-09-20 09:08:26

回答

3

看來我更容易上手

reg QUERY HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall /f "Skype Technologies S.A." /s 

爲批處理文件的基礎。它產生一個簡單的輸出如下

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{D103C4BA-F905-437A-8049-DB24763BBE36} 
    Publisher REG_SZ Skype Technologies S.A. 

End of search: 1 match(es) found. 
+0

非常感謝!這就是我正在尋找的東西。我可以讓它顯示該搜索結果下的所有值(不僅僅是匹配的發佈者值)嗎?我需要UninstallString值,它不包含任何'skype'引用...你對這樣的任務有什麼建議?我應該根據「{D103C4BA-F905-437A-8049-DB24763BBE36}」再次查詢嗎? – 2010-09-21 07:23:10

+0

@Luca Matteis:你問新的一個新問題。你應該更詳細地描述你真正需要的東西。我建議你用一個reg.exe調用來減少循環。 ev.exe的evry調用很慢,批量工作也很慢。用一個循環內的3個循環,你的程序將**至少慢1000倍。所以如果你不需要你在問題中提出的問題,你應該更準確地描述**你真正需要的**。你只能使用批量,而不是更多? VBS,PowerShell或一個簡單的C程序,它非常簡單,完全符合您的需求。 – Oleg 2010-09-21 08:23:06