dpole86
Goto Top

Ab bestimmten Datum sortieren Powershell

Guten Morgen liebe Administratoren face-smile

Ich ersuche eure hilfe da ich mich auf fremden Gebiet befinde.
Bisher habe ich nur batch gescriptet will mich aber nun weiter wagen richtung Powershell.

Ich versuche gerade aus einer CSV die Daten ab einem bestimmten Datum zu Sortieren und
die Ausgabe danach als Email zu verschicken.

Ich habe mich in Powershell etwas eingelesen und fand den Befehl import-Csv
dadurch kann ich die CSV importieren und auch nach Datum Sortieren

Wie Sortiere ich allerdings nach einem Bestimmten datum ?

Grüß eRoman

Content-ID: 222986

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

Ausgedruckt am: 22.11.2024 um 03:11 Uhr

Snowman25
Snowman25 26.11.2013 aktualisiert um 11:18:49 Uhr
Goto Top
Zitat von @Dpole86:
Guten Morgen liebe Administratoren face-smile
Hallo @Dpole86

Wie Sortiere ich allerdings nach einem Bestimmten datum ?
Wie meinst du das? Willst du, dass alles bevor einem festgelegtem Datum ignoriert wird? oder abgeschnitten?


Grüß eRoman
Gruß,
@Snowman25
Dpole86
Dpole86 26.11.2013 um 11:25:34 Uhr
Goto Top
Hi Snowman face-smile

Ich hätte gerne das ab einem Bestimmten Datum alles Ignoriert wird.

wir haben hier bei uns Rsync am Laufen um die Rechner synchron zu halten.

Das CSV welches ich gestern mit deiner Hiilfe aus dem Log erstellt habe, muss ich nun
so aufbereiten das wir jeden tag oder einmal in der woche eine mail bekommen mit dem Inhalt,
wo wir sehen, welcher Rechner sich länger nicht mehr am Rsync gemeldet hat.

so sieht die Datei bisher aus:

Client Date Time

Rechner NBAPS185 gemeldet am 2013/09/04 22:00:07
Rechner NBAPSV49 gemeldet am 2013/09/04 22:00:19
Rechner NBAPSV49 gemeldet am 2013/09/04 22:10:16
Rechner NBAPSV49 gemeldet am 2013/09/04 22:20:19
Rechner NBAPSV49 gemeldet am 2013/09/04 22:30:18
Rechner NBAPSV49 gemeldet am 2013/09/04 22:40:19
Rechner NBAPSV49 gemeldet am 2013/09/04 22:50:16
Rechner NBAPSV49 gemeldet am 2013/09/04 23:00:18
Rechner NBAPS164 gemeldet am 2013/09/05 0:03:27

Das Datum reicht von 04.09.2013 bis gestern.

Grüße Roman face-smile
Daniel.Wenzel
Daniel.Wenzel 26.11.2013 um 11:26:06 Uhr
Goto Top
Hallo Roman,

hier ist ein Link zu einem ziemlich guten PowerShell Blog:

https://blogs.technet.com/b/heyscriptingguy/archive/2012/01/10/order-you ...

Und hier findest du etwas zu der Syntax des "sort by" Objektes:

http://technet.microsoft.com/en-us/library/hh849912.aspx

Ich hoffe das hilft dir weiter.

Gruß
Daniel
colinardo
colinardo 26.11.2013 aktualisiert um 12:12:19 Uhr
Goto Top
Hallo Roman,
das ist kein Problem.
Beispiel: Wenn deine CSV-Datei z.B. so formatiert ist:
Client;DateTime
NBAPS185;2013/09/04 22:00:07
NBAPSV49;2013/09/04 22:00:19
NBAPSV49;2013/09/04 22:10:16
NBAPSV49;2013/09/04 22:20:19
NBAPSV49;2013/09/04 22:30:18
NBAPSV49;2013/09/04 22:40:19
NBAPSV49;2013/09/04 22:50:16
NBAPSV49;2013/09/04 23:00:18
NBAPS164;2013/09/05 0:03:27
kannst du folgenden Code nutzen um alle Einträge die nicht älter als 7 Tage sind sortiert nach Client anzuzeigen:
$csv = Import-CSV "C:\info.csv" -Delimiter ";"  
$csv | ?{(get-date $_.DateTime) -gt (get-date).AddDays(-7)} | sort -Property Client
Grüße Uwe
Dpole86
Dpole86 26.11.2013 aktualisiert um 13:52:36 Uhr
Goto Top
Hi Daniel Danke für die Links face-smile

Hi Uwe,

Super hat wunderbar geklappt.. Danke :D

Allerdings habe ich nun das Problem das ich Trotzdem mehrere Zeilen habe (insgesamt 1000)
somit ist das etwas unübersichtlich.

Ich müsste jetzt noch Doppelte Clients ausschliessen und nur den Letzen in dem Dokuemtn anzeigen lassen.

Kurz gesagt muss ich wissen welches Gerät sich wann das letzte mal gemeldet hat.

muss ich da mit foreach basteln?


Grüße Roman


Edit:

Habe bisher folgendes versucht:

$csv = Import-CSV "C:\win\bat\test.csv"
$csv | ?{(get-date $_.Date) -gt (get-date).AddDays(-7)} | sort -Property Date | measure -Maximum

gibt aus

Count : 548
Average :
Sum :
Maximum :
Minimum :
Property :

Count : 1
Average :
Sum :
Maximum : 11/26/2013 1:44:35 PM
Minimum :
Property :


habe auch versucht:

$csv = Import-CSV "C:\win\bat\test.csv"
$csv | ?{(get-date $_.Date) -gt (get-date).AddDays(-7)} | sort -Property Date |?{(foreach $_.Client) | measure -Maximum}

bringt aber viele viele Zeilen ^^

Edit:

Ich glaube ich habs hinbekommen.

Jetzt muss ich noch die Bat-datei anpassen :D
Dpole86
Dpole86 26.11.2013 um 14:27:44 Uhr
Goto Top
So neues Problem.

Der Code

$csv = Import-CSV "C:\win\bat\test.csv"
$csv | ?{(get-date $_.Date) -gt (get-date).AddDays(-7)} | sort -Property Date |?{(foreach $_.Client) | measure -Maximum}

bringt das gleiche Ergebniss wie

$csv = Import-CSV "C:\win\bat\test.csv"
$csv | ?{(get-date $_.Date) -gt (get-date).AddDays(-7)} | sort -Property Date

mit dem unterschied das ersortiert.

ich habe aber weiterhin Einträge wie:

NBAPS99 2013/11/20 00:19:01
NBAPS166 2013/11/20 00:51:03
NBAPS99 2013/11/20 03:29:14

wie Prüfe ich das letze datum und die letze zeit eines Clients?
colinardo
colinardo 26.11.2013 aktualisiert um 15:18:17 Uhr
Goto Top
probiers mal mit dem -Unique Parameter, so wie deine Liste aussieht steht die aktuellste Zeit des Clients immer an letzter Stelle, dann geht das hier:
$csv = Import-CSV "C:\CSVDatei.csv" -Delimiter ";"  
$csv | ?{(get-date $_.DateTime) -gt (get-date).AddDays(-7)} | Sort-Object -Property Client -Unique
Grüße Uwe
Dpole86
Dpole86 26.11.2013 um 14:39:51 Uhr
Goto Top
Sieht gut aus :D

ich glaube das war das Stichwort das ich gebruacht habe

Danke Uwe face-smile
Dpole86
Dpole86 26.11.2013 um 15:00:32 Uhr
Goto Top
Hi Uwe.

Leider ist das Problem noch nicht ganz behoben.
Zwar bekomme ich jetzt eine Liste wo der REchner jeweils nur 1 mal auftaucht, Allerdings ist das Meldedatum nicht richtig

Beispiel hat sich NBAPS77 am 04.11.2013 letztes mal gemeldet. Das aber kann nicht sein da es mein Rechner ist und ich mich immer wieder daran melde ^^

habs mit
|?{(foreach $_.Date)} -unique
versucht aber das geht irgendwie nicht
colinardo
colinardo 26.11.2013 um 15:05:37 Uhr
Goto Top
wie sieht deine CSV-Liste genau aus und welchen Delimiter verwendest du, formatiere die Liste mal so wie ich es oben geschrieben habe, dann geht das. Und bitte benutze Tags zum formatieren deines Codes hier im Forum. Merci.
Wahrscheinlich verwendest du als Delimiter Leerzeichen und hast Datum und Zeit getrennt voneinander in jeweils einer Spalte aufgeführt.
Dpole86
Dpole86 26.11.2013 um 15:11:59 Uhr
Goto Top
Hi colinardo

Muss ich den Delimiter mitnehmen?

Ja das ist richtig. Bei mir ist das Datum und die Zeit in jeweils einer Spalte.

Mein code sieht so aus:

 
$csv = Import-CSV "C:\win\bat\test.csv"  
$csv | ?{(get-date $_.Date) -gt (get-date).AddDays(-7)} | Sort-Object -Property Client -unique

Probiert habe ich es gerade eben mit


 
$csv = Import-CSV "C:\win\bat\test.csv"  
$csv | ?{(get-date $_.Date) -lt (get-date).AddDays(-7)} | Sort-Object -Property Client -unique

Allerdings ist da das letze Meldedatum am 24.09.2013

Grüße Roman
colinardo
colinardo 26.11.2013 aktualisiert um 18:47:50 Uhr
Goto Top
So hier noch mal zum Abschluss die Lösung für Roman:
bei einer so formatierten CSV-Datei:
"Client","Date","Time"
"NBAPS77", 2013/09/04,"17:52:53"
"NBAPS71", 2013/09/04,"18:00:09"
"NBAPS79", 2013/09/04,"20:00:46"
"NBAPS164", 2013/09/04,"20:27:56"
"NBAPS99", 2013/09/04,"20:59:39"
"NBAPS185", 2013/09/04,"21:00:08"
"NBAPS128", 2013/09/04,"21:10:18"
"NBAPS185", 2013/09/04,"22:00:07"
"NBAPS164", 2013/09/05,"00:03:27"
"NBAPS79", 2013/09/05,"00:24:40"
"NBAPS99", 2013/09/05,"00:43:38"
erhalten wir mit folgendem Code:
$csv = Import-CSV "C:\Temp\test.csv" -Delimiter ","  
$csv | ?{(get-date $_.Date) -gt (get-date).AddDays(-7)} | sort Client,Date,Time -Descending | group Client | %{$_.Group}
die Einträge mit dem jeweils aktuellste Datum. Doppelte Einträge in der Spalte "Client" werden also herausgefiltert und nur der Eintrag mit dem jeweils aktuellsten Datum erhalten.
Die Ausgabe sähe dann also für obige Daten so aus:
Client    Date        Time       
------    ----        ----       
NBAPS99   2013/09/05  00:43:38   
NBAPS79   2013/09/05  00:24:40   
NBAPS77   2013/09/04  17:52:53   
NBAPS71   2013/09/04  18:00:09   
NBAPS185  2013/09/04  22:00:07   
NBAPS164  2013/09/05  00:03:27   
NBAPS128  2013/09/04  21:10:18