h41msh1c0r
Goto Top

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.

$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

Content-Key: 351697

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

Printed on: April 19, 2024 at 12:04 o'clock

Member: colinardo
Solution colinardo Oct 13, 2017 updated at 11:01:15 (UTC)
Goto Top
"Calculated Property"
$dt.Rows | ?{$_.DienstA -eq 'running*' -or $_.DienstB -eq 'running*'} | select Server,@{n="Dienst";e={@{$true="DienstA";$false="DienstB"}[($_.DienstA -eq 'running*')]}}  
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
Member: H41mSh1C0R
H41mSh1C0R Oct 13, 2017 at 11:45:54 (UTC)
Goto Top
Hi Uwe,

dankööö.

VG und ein schönes Wochenende
Member: colinardo
colinardo Oct 13, 2017 updated at 12:22:09 (UTC)
Goto Top
Zitat von @H41mSh1C0R:
VG und ein schönes Wochenende
Gleichfalls, und hau dir nicht auf die Finger am 13. face-smile
Member: H41mSh1C0R
H41mSh1C0R Oct 13, 2017 updated at 12:30:18 (UTC)
Goto Top
Eine Frage ist grad noch aufgetaucht. In der Trockenübung läufts, wenn ich das in das Script einbaue bleibt die 2te Table ConfirmServices leer.

    $global:table.Rows | ?{$_.PxeS -eq 'RUNNING*' -or $_.FSWUI -eq 'RUNNING*'} `  
                                                 | select Server,@{n="Dienst";e={@{$true="PxeS";$false="FSWUI"}[($_.PxeS-eq 'RUNNING*')]}} `  
                                                 | %{$row = ("$_.Server","$_.Dienst")  
                                                 $global:ConfirmServices.Rows.Add($row)}

Oder wäre es besser an der Stelle nur ein DataView der ersten Table zu benutzen?

Den Select muss ich mir noch auf den Hirnwindungen zergehen lassen =), vielleicht bekomme ich das ja auch hin für mehrere Services. Sind nicht nur 2 .

VG
Member: H41mSh1C0R
H41mSh1C0R Oct 13, 2017 at 12:29:17 (UTC)
Goto Top
Meinen Fr den 13. Notfall hatte ich heute morgen gegen 7:30 schon hinter mir, das Klischee ist heute schon zur genüge bedient. ;(
Member: colinardo
colinardo Oct 13, 2017 updated at 12:39:39 (UTC)
Goto Top
Erster Fehler: Leerzeichen zwischen Operator und Variable vergessen
$_.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)")
oder gleich
$row = @($_.Server, $_.Dienst)

Muss jetzt weg....
Member: H41mSh1C0R
H41mSh1C0R Oct 13, 2017 updated at 14:20:05 (UTC)
Goto Top
Danköööö die 2te.

Hab noch 1-2 Knoten, aber an die mach ich mich morgen auf der Spielewiese. =)

EDIT:
Hab das auf alle anderen Dienste ausgeweitet, allerdings noch nicht in schön. Das Schau ich mir dann am Mo nochmal an wenn ich wieder zurück bin.
Member: colinardo
colinardo Oct 15, 2017 updated at 08:40:48 (UTC)
Goto Top
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:
#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
Member: H41mSh1C0R
H41mSh1C0R Oct 15, 2017 at 09:20:40 (UTC)
Goto Top
Mensch Uwe,

du sollst doch nicht dein Wochenende opfern. =)
Fettes, danke. Super kompakt.
Ich traue mich garnicht meine Variante zu posten.

Noch ein schönes Wochenende
Member: colinardo
colinardo Oct 15, 2017 at 09:49:03 (UTC)
Goto Top
Zitat von @H41mSh1C0R:
Noch ein schönes Wochenende
Kein Thema, genieße den goldenen Oktober. face-smile