我想列出所有卸载条目,并忽略一些带有白名单的条目。
列出卸载条目有效,但我不明白如何使用$mylist
来忽略“app1”,“app2”,“app3”。
$mylist = @("app1","app2","app3")
Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall,
HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall |
Get-ItemProperty |
Where-Object {$_.DisplayName -notmatch $mylist } |
Select-Object -Property DisplayName, UninstallString
有你的想法吗?
答案 0 :(得分:2)
要检查列表是否包含特定元素,请使用-notcontains
或-notin
运算符:
... | Where-Object { $mylist -notcontains $_.DisplayName } | ...
或
... | Where-Object { $_.DisplayName -notin $mylist } | ...
请注意,-notin
运算符在PowerShell v3之前不可用。
对于一个列表与另一个列表的部分匹配,你需要这样的东西:
... | Where-Object {
$name = $_.DisplayName;
-not ($mylist | Where-Object {$name -like "*$_*"})
} | ...
答案 1 :(得分:1)
您可以从列表中构建正则表达式模式,然后使用-match
运算符:
# Construct pattern
$pattern = @($mylist|ForEach-Object {[regex]::Escape($_)}) -join '|'
# Use pattern with -match
... |Where-Object { $_.DisplayName -match $pattern }