Powershell Filtern Filtern Filtern
Aloa in die Runde,
ich brech mir gerade wieder etwas die Finger ^^ am Freitag.
DataTable einmal durchlaufen und alle Einträge finden wo "running*" steht.
Ergebnis in eine Liste und pro "running*" Feld pro Server einen Eintrag.
Ergebnis:
Jetzt hab ich zwar den Inhalt, angepeilt ist aber:
Das Zauberwort heißt bestimmt PSCustomObject, oder?. =)
VG
ich brech mir gerade wieder etwas die Finger ^^ am Freitag.
DataTable einmal durchlaufen und alle Einträge finden wo "running*" steht.
Ergebnis in eine Liste und pro "running*" Feld pro Server einen Eintrag.
$dt = New-Object System.Data.DataTable
$dt.Columns.Add("Server") | out-null
$dt.Columns.Add("DienstA")| out-null
$dt.Columns.Add("DienstB")| out-null
$dt.Rows.Add(("AAA","running","running"))| out-null
$dt.Rows.Add(("BBB","running*","running*"))| out-null
$dt.Rows.Add(("CCC","running*","running"))| out-null
$dt.Rows.Add(("DDD","running","running"))| out-null
$dt.Rows.Add(("EEE","running*","running"))| out-null
$dt.Rows.Add(("FFF","running*","running*"))| out-null
$dt.Rows.Add(("GGG","running","running"))| out-null
$dt.Rows.Add(("HHH","running","running*"))| out-null
$dt | %{
$_ |? {$_.DienstA -eq 'running*'} | Select-Object "Server", "DienstA"
$_ |? {$_.DienstB -eq 'running*'} | Select-Object "Server", "DienstB"
}
Ergebnis:
BBB running*
BBB running*
CCC running*
EEE running*
FFF running*
FFF running*
HHH running*
Jetzt hab ich zwar den Inhalt, angepeilt ist aber:
BBB DienstA
BBB DienstB
CCC DienstA
EEE DienstA
FFF DienstA
FFF DienstB
HHH DienstB
Das Zauberwort heißt bestimmt PSCustomObject, oder?. =)
VG
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 351697
Url: https://administrator.de/forum/powershell-filtern-filtern-filtern-351697.html
Ausgedruckt am: 16.04.2025 um 21:04 Uhr
10 Kommentare
Neuester Kommentar
"Calculated Property"
Effektiver wäre es wenn du die Dienste nicht als Spalten setzen würdest, sondern sie zusammen mit Servername mehrfach inkl. Dienstname auflistestet, wäre auch leichter zu gruppieren.
Grüße Uwe
$dt.Rows | ?{$_.DienstA -eq 'running*' -or $_.DienstB -eq 'running*'} | select Server,@{n="Dienst";e={@{$true="DienstA";$false="DienstB"}[($_.DienstA -eq 'running*')]}}
Grüße Uwe
Gleichfalls, und hau dir nicht auf die Finger am 13. 
Erster Fehler: Leerzeichen zwischen Operator und Variable vergessen
oder gleich
Muss jetzt weg....
$_.PxeS-eq 'RUNNING*'
Zweiter Fehler: Innerhalb von Anführungszeichen und bei Abruf einer Eigenschaft musst du eine SubExpression verwenden statt:$row = ("$_.Server","$_.Dienst")
so$row = ("$($_.Server)","$($_.Dienst)")
$row = @($_.Server, $_.Dienst)
Muss jetzt weg....
Nun wenn du es unbedingt mit den Diensten als Spalten so organisieren willst und dabei sehr viele Dienste überprüfen willst, mach es so das du dir als erstes alle Spaltennamen in einer Variablen speicherst welche den Diensten entsprechen und dann für jede Row diese Spaltennamen iterierst.
Hier ein entsprechendes Beispiel bei dem die erste Spalte dem Servernamen entspricht und alle weiteren den Diensten:
Ausgabe:
Hier ein entsprechendes Beispiel bei dem die erste Spalte dem Servernamen entspricht und alle weiteren den Diensten:
#Datatable erzeugen
$dt = New-Object System.Data.DataTable
$dt.Columns.AddRange(("Server","DienstA","DienstB","DienstC")) | out-null
$dt.Rows.Add(("Server_1","running","running*","running")) | out-null
$dt.Rows.Add(("Server_2","running*","running*","running")) | out-null
$dt.Rows.Add(("Server_3","running","running*","running*")) | out-null
# Spaltennamen der Dienste auswählen (erste Spalte mit Servernamen überspringen)
$serviceCols = $dt.Columns.ColumnName | select -skip 1
$result = foreach($row in $dt.Rows){
# Spaltennamen itterieren und nur die interessanten ausfiltern
$serviceCols | ?{$row.$_ -eq 'running*'} | select @{n='Server';e={$row.Server}},@{n='Service';e={$_}}
}
$result
Ausgabe:
Server Service
------ -------
Server_1 DienstB
Server_2 DienstA
Server_2 DienstB
Server_3 DienstB
Server_3 DienstC
Kein Thema, genieße den goldenen Oktober. 