2017-03-10 77 views
2

我想列出所有卸载条目并忽略白名单中的某些条目。

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

,用于检查列表中不包含特定元素使用-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 "*$_*"}) 
} | ... 
+0

你好感谢anwser,但我没有完成我的问题,例如与应用程序“Microsoft Visual C++ 2008 Redistributable”我只会插入“Visual”而不是所有完整的名称,我尝试“ - 不喜欢”,但它不起作用,你有想法吗? – twenty94470

+0

查看更新的答案。请确保下次不会留下任何与您的问题相关的内容。 –

+0

很抱歉地说了这个,但是好像在多次测试后都不起作用, 我还有一行包含我列表的元素。谢谢你致我的问题 – twenty94470

1

您可以构建从列表中选择正则表达式,然后使用-match操作:

# Construct pattern 
$pattern = @($mylist|ForEach-Object {[regex]::Escape($_)}) -join '|' 

# Use pattern with -match 
... |Where-Object { $_.DisplayName -match $pattern } 
+0

它的工作很好谢谢,我从来没有使用模式,所以我会看看:)再次感谢你:) – twenty94470