我发现 WMIC 无法获取所有已安装的软件,因为它从某些特定/默认注册表中获取信息作为唯一信息,并且该注册表本身并不包含控制面板上显示的软件的完整列表。
我发现这个 Powershell 命令行确实可以找到 wmic 列出和未列出的已安装软件:
Get-ItemProperty HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | select DisplayName, DisplayVersion, InstallDate
但是,我需要在该行添加一个 FILTER (很抱歉,我对 Powershell 不太了解)来过滤特定名称,即“Teamv”,所以它只向我显示 start/ 的软件包含这个词,这样我就可以知道该软件是否安装了。
如果(如果)还存在一种从单词列表中获取单词的方法(假设您想了解更多已安装的软件,即 Teamviewer、Kaspersky 和 Logmein),那就太棒了!!
感谢您的帮助! =)
Where-Object
cmdlet
用于过滤对象列表 - 无论是整体还是按属性值:
Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* |
Where-Object DisplayName -match 'Teamviewer|Kaspersky|LogMeIn' |
Select-Object DisplayName, DisplayVersion, InstallDate
注:
以上,由于仅涉及单个比较操作,因此能够采用简化语法;也就是说,
Where-Object DisplayName -match 'Teamviewer|Kaspersky|LogMeIn'
是以下基于脚本块的形式({ ... }
)的简化形式,其中必须通过自动$_
变量引用管道输入对象;对于更复杂的条件,您需要此形式:
Where-Object { $_.DisplayName -match 'Teamviewer|Kaspersky|LogMeIn' }
也就是说,使用
.DisplayName
运算符将每个管道输入对象的 'Teamviewer|Kaspersky|LogMeIn'
属性值与 regex(正则表达式)、
-match
进行比较。
$true
时,才会传递(输出)当前的输入对象(可能通过类型强制;此处,-match
直接返回 $true
或 $false
)-match
:
|
) 使其查找三个字符串中的 any;可以使用额外的正则表达式构造(例如 ^
仅在输入字符串的 start 处匹配),以进一步约束匹配逻辑。-cmatch
变体进行区分大小写的匹配。