我是 PowerShell 菜鸟。提前抱歉。我正在尝试编写一个快速脚本来检查 PC 以查看是否安装了应用程序列表。我将列表存储在一个数组中,并将其与注册表中卸载键中应用程序的显示名称进行比较。
$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 的版本升级几个档次时都更新脚本。
这可能是一些简单的东西,比如扩展属性之类的,但它超出了我的理解范围。感谢您的帮助。
最佳答案
你可以做的是从你的 $Apps
数组中创建一个正则表达式,然后使用 -match
来对抗它。您需要对字符串进行转义以说明任何特殊字符,并使用管道将它们连接起来(在 RegEx 中是 或
运算符)。
$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
这应该与您匹配的关键字。
关于windows - Windows 注册表中的应用程序显示名称部分匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44706563/