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

标签 windows powershell scripting registry

我是 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/

相关文章:

bash - 这个脚本有什么作用?

powershell - 在PowerShell中加载iTextSharp时出现问题

windows - 查看第 3 方 DLL 中的可用消息字符串(来自 mc.exe)

windows - git bash 终端增加要查看的行数(windows)

java - JDK 似乎已安装,但未被检测到并且命令不起作用

ruby - 从 Ruby 执行 PowerShell

excel - Powershell - 为文字或图像解析 PDF 文件

Bash Shell 参数扩展 ${ }

linux - Cut 对我来说是错误的,说它不是文件或目录。我如何使用它来 grep "on"(见下文)

python - Windows:直接检查cp1252