从注册表一次查询多个条目(使用reg查询)

sco*_*4er 1 registry powershell cmd regedit

我运行后续的reg查询,这需要相当长的时间:

reg query HKLM\SOFTWARE\Classes /s /f "foo"
reg query HKLM\SOFTWARE\Classes /s /f "bar"
Run Code Online (Sandbox Code Playgroud)

有什么办法可以一次搜索多个值reg query吗?

mkl*_*nt0 5

没有呢,可惜reg query /s /f只接受一个单一的过滤器表达式。

过滤器表达式:向aschipfl求助。

  • 默认情况下与所有注册表实体匹配:键名称,值名称和数据。

    • 选项/k(键),/v(值)和/d(数据)的(或-组合)可用于缩小范围。

      • /v也可以不带 /f,在这种情况下,它需要一个完全/v foo匹配的值名搜索词(例如)(请参见下文);如果它们包含data,则仅返回默认值(名称为空字符串的值)。/ve
      • 当与或组合 /f时/v <valueNameSearchTerm>/ve,仅支持组合键搜索(/k)通过/f以缩小匹配范围;也就是说,唯一有意义的组合是:
        • /f <keySearchTerm> /k /v <valueNameSearchTerm>
        • /f <keySearchTerm> /k /ve
        • 这样,/v <valueNameSearchTerm>/ /ve匹配仅限于match的那些键/f <keySearchTerm>,总计为AND逻辑。
        • 任何其他组合-省略/k,添加/d,仅使用/d有效-都会导致/f搜索项被忽略。
    • /t REG_* 可用于将匹配范围缩小到指定的值类型,例如 REG_SZ

  • 默认情况下执行不区分大小写的子字符串匹配。

    • 支持通配符*(任意数量的字符,包括无字符)和?(恰好1个字符)-尽管请注意,类似的东西foo*仍然仅执行子字符串匹配;似乎没有办法锚定子字符串。

      • 如前所述,当您/v直接使用值名称搜索词时(例如,/v foo它必须完全匹配;例如,要查找包含子字符串的值名称,foo则必须使用)*foo*。
    • /e 在不支持通配符的情况下执行整个字符串匹配。

    • /c使用区分大小写的匹配。

  • 数字数据,例如以十进制字符串表示形式REG_DWORD匹配

  • 二进制数据(REG_BINARY)匹配为“字节字符串”:不带分隔符的2十六进制字节值列表。

运行reg query /?以查看所有选项或查阅文档。


您可以使用以下PowerShell命令来提供多个过滤器:

注意:

  • 该命令仅限于以下搜索逻辑 -尽管可以对其进行修改以支持所有reg query选项,但肯定会要求创建函数包装器:

    • 使用正则表达式(带有-match)而不是通配符匹配(带有-like),这既简化了命令,又使其更灵活(使用该解决方案改而使用通配符匹配并不难)。

    • 仅搜索注册表数据,而不搜索键名和值名。

      • 例如,仅搜索键名,该命令将非常简单:
        Get-ChildItem HKLM:\SOFTWARE\Classes -Recurse | Where-Object { $_.PSChildName -match 'foo|bar' }
    • 与with不同reg.exe,二进制数据基于十进制字符串表示形式逐字节匹配。

    • 仅检查目标键的子键,而不检查目标键本身。

  • 使用单个过滤器时,该命令的速度比慢reg.exe,但是使用多个过滤器时,该命令的速度最终可能会比多个reg.exe调用快。对于OP,花了4-5-YMMV。

    • Get-ChildItem直接使用.NET框架进行递归密钥枚举来替换该调用可能会带来速度改进,尽管我不知道有多少。专用的本机二进制文件(例如)reg.exe总是比自定义PowerShell代码快。

    • 通常,PowerShell解决方案的主要优点是:

      • 返回对象,这极大地方便了后续处理(无需解析文本输出)。
      • 使用正则表达式可以进行更复杂的匹配。
# The two filters to use, combined into a single regex.
$regex = 'foo|bar'

Get-ChildItem HKLM:\SOFTWARE\Classes -Recurse | ForEach-Object { 
  foreach ($value in $_.GetValueNames()) { 
    if (($data = $_.GetValue($value)) -match $regex) { 
      [PSCustomObject]@{
        Key = $_.Name
        Value = if ($value) { $value } else { '(default)' }
        Data = $data
      }
    } 
  } 
}
Run Code Online (Sandbox Code Playgroud)

输出类似于以下内容,其中Data包含匹配项的列(向右滚动;或者,将上方的管道传递Format-List给每行一个属性的视图):

Key                                                                                             Value     Data
---                                                                                             -----     ----
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AllSyncRootObjects                                          StatusBar prop:~System.StatusBarViewItemCount;~System.StatusBarSelectedItemCount...
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0002E132-0000-0000-C000-000000000046}\InprocServer32 Class     Microsoft.Vbe.Interop.CommandBarEventsClass
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0002E132-0000-0000-C000-000000000046}\InprocServe... Class     Microsoft.Vbe.Interop.CommandBarEventsClass
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0006F054-0000-0000-C000-000000000046}                (default) Microsoft Outlook InfoBar Control
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0006F054-0000-0000-C000-000000000046}\InprocServer32 Class     Microsoft.Office.Interop.Outlook.OlkInfoBarClass
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0006F054-0000-0000-C000-000000000046}\InprocServe... Class     Microsoft.Office.Interop.Outlook.OlkInfoBarClass
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0006F054-0000-0000-C000-000000000046}\ProgID         (default) Outlook.OlkInfoBar.1
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0006F054-0000-0000-C000-000000000046}\VersionInde... (default) Outlook.OlkInfoBar
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{056440FD-8568-48e7-A632-72157243B55B}                (default) Explorer Navigation Bar
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{05d7b0f4-2121-4eff-bf6b-ed3f69b894d7}                (default) Taskbar Control Panel
...
Run Code Online (Sandbox Code Playgroud)