141128

Powershell Pipe filtern nach Textdatei Blockliste

Hallo Miteinander,

Ich versuche ein Powershellskript zu erstellen das alle installierten Programme ausliest, etwas sortiert und dann als txt Datei ausgibt.

Leider schmeißen einige Entwickler, vorallem Microsoft, recht viel, für mich in dem Fall, Müll in die Quelle. Darum möchte ich einige Einträge anhand einer Blockliste entfernen.
Ich habe zuerst einige allgemeinere Strings als Filter im Skript selber in Variablen geschrieben, aber es sind noch einige Einträge drinnen die keinen allgemeinen Mustern folgen und daher so nicht erfasst werden können. Darum möchte ich umsteigen und in der Pipe auf den Inhalt einer txt datei hin Filtern, das gelingt mir aber leider nicht...

$ignore1="Microsoft Visual C++"; $ignore2="Microsoft .NET"; $ignore3="vs_"; $ignore4="Microsoft Windows Desktop Runtime"; $ignore5="NVIDIA"; $ignore6="Microsoft ASP.NET"  
$Outputfile="C:\...\temp\test.txt"  
$Filterfile="C:\...\Skripts\Funktionen\blocklist.txt"  

$List64 = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*    | Select-Object DisplayName, Publisher, DisplayVersion, InstallDate 
$List32 = Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*                | Select-Object DisplayName, Publisher, DisplayVersion, InstallDate
$List = $List64 + $List32
$filters = Get-Content $filterFile

$List | Where-Object DisplayName | 
    Where-Object {($_.DisplayName -notlike "$ignore1*") -and ($_.DisplayName -notlike "$ignore2*") -and ($_.DisplayName -notlike "$ignore3*") -and ($_.DisplayName -notlike "$ignore4*") -and ($_.DisplayName -notlike "$ignore5*") -and ($_.DisplayName -notlike "$ignore6*")} |  
       Where-Object DisplayName | Sort-Object -Property Publisher | Format-Table > $Outputfile
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 666403

Url: https://administrator.de/forum/powershell-pipe-filtern-nach-textdatei-blockliste-666403.html

Ausgedruckt am: 14.07.2025 um 06:07 Uhr

148121
Lösung 148121 04.05.2021 aktualisiert um 17:13:52 Uhr
# Pfad zur Liste mit untereinander stehenden Begriffen
$ignorelist = 'C:\pfad\blocklist.txt'  
# Regex Pattern aus Liste erstellen
$ignore_pattern = (gc $ignorelist | %{[regex]::Escape($_)}) -join '|'  
# Object nach Pattern filtern
$list | ?{$_.DisplayName -notmatch $ignore_pattern}
Gruß w.
141128
141128 04.05.2021 aktualisiert um 20:28:29 Uhr
So, für alle die es interessiert anbei die für mich funktionierende Lösung. Ich habe irgendwo eine .txt Datei liegen mit allen zu filternden Strings, ein filter String per Zeile und dieses Skript:

$Outputfile="C:\__Somewhere__\test.txt"  
$filters = Get-Content "C:\__Somewhere__\filterfile.txt"  

$filter = '^(' + ($filters.ForEach({ [regex]::Escape($_) }) -join '|') + ')'  

$List64 = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*    | Select-Object DisplayName, Publisher, DisplayVersion, InstallDate 
$List32 = Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*                | Select-Object DisplayName, Publisher, DisplayVersion, InstallDate
$List = $List64 + $List32

$List | Where-Object DisplayName | Where-Object DisplayName -notmatch $filter | Sort-Object -Property Publisher > $Outputfile