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吗?
没有呢,可惜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)