2016-04-16 16 views
0

Ich bin ein wenig verloren auf die beste Methode für das Filtern von Daten (siehe unten) mit mehreren Kriterien.Mehrere reguläre Ausdrücke stimmen überein

Als Beispiel MyServer2 und Sat 18:00 würden in MyServer2 und 04-23-16 1800 dass ich Ausgabe in zwei Textdateien kann.

"Server","MaintenanceWindow","Ping","LastReboot" 
"MyServer1","NoDeadline","Alive","4/8/2016 2:44:32 PM" 
"MyServer2","NA - DYNALG - SRV - Patching - Prod - Sat 18:00","Alive","4/16/2016 10:00:47 AM" 
"YourServer","NA - All DA Servers - Patching - Prod - Fri 22:00","Alive","Access Denied!" 

Mein aktueller Ansatz unten gezeigt wird, sind die beiden Where-Object Linien, aber das ist immer mühsam und es ist nicht leicht zu lesen.

Ich bin mir auch nicht sicher, wie ich die statische "$((get-date).AddDays(7).ToString('MM-dd-yy')) 17:58" in etwas dynamisches aktualisieren kann, das die Datum/Uhrzeitberechnung durchführt und die Datums-/Uhrzeit-Zeichenfolge ausgibt. Ich konnte [datetime]"04/23/2016 18:00" - (get-date) verwenden, aber ich bin mir nicht sicher, wie ich die Daten in dieses Format bringen kann.

Where-Object {$_ -like '*sat?18:00*' -and $_.MaintenanceWindow -notmatch 'all.da.servers' -and $_.Server -match "^My"} | % {"{0}" -f $_.Server} 

Where-Object {$_ -like '*sat?18:00*' -and $_.MaintenanceWindow -notmatch 'all.da.servers' -and $_.Server -match "^My"} | % {"{0}" -f $_.MaintenanceWindow -replace "^NA.+", "$((get-date).AddDays(7).ToString('MM-dd-yy')) 17:58"} 
+1

Dies ist wahrscheinlich der beste Ansatz zum Filtern von Daten. Sie können die Lesbarkeit verbessern, indem Sie den Skriptblock in mehrere Zeilen aufteilen oder in eine Filterfunktion einfügen. –

+0

Möchten Sie zu dem Downvote Ihre Einwände posten und Verbesserungsvorschläge machen? Nicht jeder, der Fragen auf dieser Seite stellt, hat Erfahrung mit Skripten/Programmierung. – user4317867

Antwort

1

Ich würde empfehlen, Ihre Eingabe CSV mit zusätzlichen Feldern aktualisieren, zumindest für den Tag und die Uhrzeit des Wartungsfensters starten, aber vielleicht auch für den Namen der Servergruppe. Dies würde die Filterung/Verarbeitung erheblich vereinfachen.

Wenn Sie dynamisch das Datum des nächsten Samstag berechnen Sie können es wie folgt aus:

$today = [DateTime]::Today 
$nextSaturday = $today.AddDays((7 - $today.AddDays(1).DayOfWeek)) 

Da Sie den gleichen Filter verwenden beide Male können Sie die Loops kombinieren und über Add-Content Ausgang tun . Dennoch verbessert das Einbetten der Bedingungen als @RyanBemrose die allgemeine Lesbarkeit des Filters. Außerdem ist es sinnlos, den Formatierungsoperator zu verwenden, um eine Zeichenfolge in eine ansonsten leere Zeichenfolge einzufügen, also entfernen Sie diese.

... | Where-Object { 
    $_ -like '*sat?18:00*' -and 
    $_.MaintenanceWindow -notmatch 'all.da.servers' -and 
    $_.Server -match '^My' 
} | ForEach-Object { 
    $_.Server | Add-Content 'file1.txt' 
    $_.MaintenanceWindow -replace '^NA.+', ('{0:MM-dd-yyy} 17:58' -f $nextSaturday) | 
    Add-Content 'file2.txt' 
} 
+0

Ich bin ein wenig hängen auf diese zwei zusätzlichen Spalten in der Ausgabe CSV. Frage aktualisiert – user4317867

+0

Ich glaube, ich steckte wieder im [XY-Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem), aber dieses Mal bin ich mir dessen bewusst. – user4317867

+0

Ich werde diese Antwort auf die Lesbarkeitsfrage akzeptieren. Danke nochmal Ansgar Wiechers! Ich werde auch etwas Zeit in die Erstellung einer Filterfunktion investieren, um das Skript weiter zu säubern. – user4317867