通过批处理语法查询Windows注册表
我试图查询一个特定的注册表文件夹(或者你想叫它什么),以获取一些信息 特别是通过批处理语法查询Windows注册表,windows,batch-file,registry,Windows,Batch File,Registry,我试图查询一个特定的注册表文件夹(或者你想叫它什么),以获取一些信息 特别是HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall文件夹包含已安装软件的列表 问题在于,每个软件都是通过一个随机键值来识别的,比如{0001B4FD-9EA3-4D90-A79E-FD14BA3AB01D},而不是实际的软件(比如Skype) 这使得很难找到Skype标识符,因为我需要遍历Uninstall文件夹中的所有内容
HKEY\U LOCAL\U 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
)
)
)
)
有没有一种更干净、更安全的方法来批量实现这一点?这似乎更易于使用
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.
此批处理循环浏览卸载键下的项目,并搜索定义的软件名称,例如Skype。找到软件和完整密钥后,它将使用它搜索并打印出DisplayName和UninstallString,如下面的输出所示 注:
Key: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Skype_is1
DisplayName: Skype version 8.64
UninstallString: "C:\Program Files (x86)\Microsoft\Skype for Desktop\unins000.exe"
也许你最好在服务器上问这个问题。关于您的数据结构,我认为仅仅将其写入临时文件是不够的?!谢谢!这就是我一直在寻找的东西。我是否可以显示该搜索结果下的所有值(而不仅仅是匹配的发布者值)?我需要不包含任何“skype”引用的字符串值。。。你对这样的任务有什么建议?我是否应该根据
{D103C4BA-F905-437A-8049-db2463bbe36}
再次查询它?@Luca Matteis:你问了一个新问题。你应该更详细地描述你真正需要什么。我建议您通过一次调用reg.exe来减少循环。reg.exe的Evry调用很慢,批处理工作也很慢。在3个循环中,一个循环在另一个循环中,您的程序将至少慢1000倍。所以,如果你不需要确切地回答你的问题,你应该更准确地描述你真正需要什么。你能不能只用一批而不用更多?VBS、PowerShell或一个简单的C程序,非常简单,完全满足您的需要。
Key: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Skype_is1
DisplayName: Skype version 8.64
UninstallString: "C:\Program Files (x86)\Microsoft\Skype for Desktop\unins000.exe"