2017-03-10 79 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