我是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的版本点击几个缺口时,我宁愿不必更新脚本。
这可能很简单,比如扩展属性或其他东西,但它超出了我的掌握范围。感谢您的帮助。
答案 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
这应该与您匹配关键字。