Weisheiten - der Netz-Weise Blog
Aus einer Liste von Datumswerten jeweils x Sekunden überspringen
Um aus einer Liste von Datumswerten (z.B. aus einer Logdatei) nur einen Wert pro Zeiteinheit (also z.B. pro Sekunde) auszugeben, erstellt man sich zuerst einen Wert, der die Sprungweite speichert. Da Powershell Zeitwerte in 10.000.000stel Sekunden - den sogenannten Ticks - speichert, muss die Sprungweite mit den Ticks pro Zeiteinheit multipliziert werden. Die Ticks holt man sich am Besten aus der Timespan-Klasse, weil man sich bei der Menge von Nullen schon mal vertippen kann und es auch deutlich besser lesbarer ist. Auf die Timespan-Klasse greift man mit eckigen Klammern zu: [Timespan].
$RangeInSeconds = 10 $Range = $RangeInSeconds * [TimeSpan]::TicksPerSecond
Anschließend speichert man den ältesten Zeitwert der Liste in einer Variablen, durchläuft mit einer Foreach-Schleife die Liste und vergleicht die Ticks des Datumswert des Listenelements mit dem ersten Zeitwert. Wenn ein passender Zeitwert gefunden wurde, muss der Vergleichswert jeweils um die Range erhöht werden. Dafür muss das Listenelement das Datum als Datetime-Objekt gespeichert haben. Ist das nicht der Fall, kann man das Datum zuerst konvertieren. Das geht über die explizite Konvertierung zu Datetime oder, falls das Datum nicht korrekt erkannt wird, weil z.B. das deutsche Datumsformat tt-mm-yyyy verwendet wird, mit der statischen Datetime-Methode Parseexact.
[DateTime]'2024-03-02' # Konvertiert den 3. März 2024 [DateTime]'03-02-2024' # Konvertiert den 3. Februar 2024 [DateTime]::Parseexact('03-02-2024','dd-MM-yyyy') # 3.02.2024
Bei der Konvertierung kann in allen 3 Beispielen auch die Uhrzeit angegeben werden: '2024-03-02 19:01:23'. Die Kürzel für Sekunden, Minuten und Stunden sind dann ss, mm und HH. Die Groß-/Kleinschreibung ist hier wichtig, da MM für Monat und mm für Minuten steht!
Die Foreach-Schleife sieht dann ungefähr so aus:
$counter = $Entries[0].Date.Ticks # den ersten Wert der Liste als Vergleich speichern Foreach ( $Entry in $Entries ) { If ( $Entry.Date.Ticks -ge $Counter ) { $Entry $Counter += $Range # Den Vergleichwert um die Range erhöhen } }
Kommentare