不匹配$ mylist的每个元素

时间:2017-03-10 11:13:07

标签: list powershell

我想列出所有卸载条目,并忽略一些带有白名单的条目。

列出卸载条目有效,但我不明白如何使用$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

有你的想法吗?

2 个答案:

答案 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 }