Windows注册表中应用程序DisplayNames的部分匹配?

时间:2017-06-22 18:07:19

标签: windows powershell scripting registry

我是PowerShell noob。提前抱歉。我正在尝试编写一个快速脚本来检查PC以查看是否安装了应用程序列表。我将列表存储在一个数组中,并将其与注册表中卸载键中的应用程序的DisplayName进行比较。

$Apps=@('Paint.net', 'Blender', 'SketchUp')

Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | 
  Where-Object {$Apps -Like $_.DisplayName} | 
  Select-Object DisplayName, DisplayVersion

这样可行,但仅适用于完全匹配。 “Blender”和“Paint.net”列在输出中,但不是SketchUp,因为完整的DisplayName是“SketchUp 2017”。无论DisplayName中的其他文本(版本号)如何,如何匹配关键字?我在$ _.DisplayName属性周围尝试过通配符,但是它们要么抛出错误要么根本不返回任何内容。每当Audacity的版本点击几个缺口时,我宁愿不必更新脚本。

这可能很简单,比如扩展属性或其他东西,但它超出了我的掌握范围。感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

您可以做的是从$Apps数组中制作正则表达式,然后使用-match。您将需要转义字符串以考虑任何特殊字符,并使用管道(在RegEx中为or运算符)加入它们。

$Apps=@('Paint.net', 'Blender', 'SketchUp')
$AppsRegEx = ($Apps | ForEach{[regex]::escape($_)}) -join '|'

Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | 
  Where-Object {$_.DisplayName -match $AppsRegEx} | 
  Select-Object DisplayName, DisplayVersion

这应该与您匹配关键字。