Windows注册表中应用程序显示名的部分匹配?

Windows注册表中应用程序显示名的部分匹配?,windows,powershell,scripting,registry,Windows,Powershell,Scripting,Registry,我是个超级无赖。先说声对不起。我正在尝试编写一个快速脚本,它将检查PC,查看是否安装了应用程序列表。我将列表存储在一个数组中,并将其与注册表中卸载项中应用程序的DisplayName进行比较 $Apps=@('Paint.net', 'Blender', 'SketchUp') Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$Apps -Like $

我是个超级无赖。先说声对不起。我正在尝试编写一个快速脚本,它将检查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,因为完整的显示名称是“SketchUp 2017”。如何使其与关键字匹配,而不考虑DisplayName中的其他文本(版本号)?我尝试了在$\ DisplayName属性周围使用通配符,但它们要么抛出错误,要么根本不返回任何内容。我不希望每次Audacity的版本点击几个等级时都要更新脚本


这可能是一些简单的东西,比如扩展属性或其他东西,但我无法理解。非常感谢您的帮助。

您所能做的就是从
$Apps
数组中生成一个正则表达式,并使用
-match
。您需要对字符串进行转义以解释任何特殊字符,并使用管道(在正则表达式中是
操作符)将它们连接起来


这应该与您的关键词相匹配。

这是一个常见的powershell问题,但我找不到一个好的答案来链接。你可以将(a)和(m)进行比较——将一件事与另一件事进行对比。您可以将(a,b,c,d)与(m)进行比较,后者具有标准行为,如果(a,b,c,d)中的任何内容与(m)匹配,则触发一个答案。但是你试图在一次移动中比较(a,b,c,d)和(m,n,o,p),得到一个答案——你不能,结果会是什么?你需要两个循环。
$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