Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过批处理语法查询Windows注册表_Windows_Batch File_Registry - Fatal编程技术网

通过批处理语法查询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。找到软件和完整密钥后,它将使用它搜索并打印出DisplayNameUninstallString,如下面的输出所示

注:

  • 对于某些软件,例如Skype、记事本+,该键可能不包含GUID,例如{BEB5FB69-4080-466F-96C4-F15DF271718B}。此批处理可以查找带或不带GUID的软件
  • 如果名称太短,它可以返回多个软件
  • 使用%x86GUID%变量搜索32位软件,使用%x64GUID%搜索64位软件
  • 输出

    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"