2010-09-20 97 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