141128
Goto Top

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

Content-Key: 666403

Url: https://administrator.de/contentid/666403

Printed on: April 24, 2024 at 17:04 o'clock

Mitglied: 148121
Solution 148121 May 04, 2021 updated at 15:13:52 (UTC)
Goto Top
# 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.
Mitglied: 141128
141128 May 04, 2021 updated at 18:28:29 (UTC)
Goto Top
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