Mit Powershell Datum aus Ordnername als Datum extrahieren
Moin!
ja, ich habe bereits gesucht und auch ein paar Fortschritte gemacht, da ich aber außerhalb von Exchange gerade erst mit Powershell anfange, hänge ich gerade ein wenig.
Was habe ich?
- Ich habe eine wachsende Menge von Ordnern, die allesamt mit einem Datum benannt sind. Beispiel: 2018-12-31
- Die Ordner haben wirklich nur das Datum als Ordnernamen in der Formatierung wie oben, also YYYY-MM-DD
- Das System (Windows Server 2008 R2) und Regionaleinstellungen sind deutsch
- Powershell V 4.0
Was brauche ich?
- Ich will anhand des Namens den aktuellsten Ordner identifizieren. Die Namen werden unabhängig von der tatsächlichen Erstellungs- oder Änderungszeit erzeugt, die für mich maßgebliche Info steht im Ordnernamen, nicht in den Eigenschaften.
Wie weit komme ich?
- Ich lade alle Ordnernamen in ein Array.
Wo hängt es?
- Ich kriege es nicht hin, die einzelnen Einträge in ein Datum zu konvertieren. Wenn ich mit ParseExact arbeite, bekomme ich die Meldung, dass das Ausgangsformat nicht korrekt wäre. Mit einer selbstgeklauten Funktion "ConvertStringDate", die ich im Internet gefunden habe, bekomme ich leere Ergebnisse. Ja, natürlich habe ich die auf meine Umgebung angepasst
Hat jemand eine Idee für mich, wie ich das gelöst bekomme?
Gruß
Jörg
ja, ich habe bereits gesucht und auch ein paar Fortschritte gemacht, da ich aber außerhalb von Exchange gerade erst mit Powershell anfange, hänge ich gerade ein wenig.
Was habe ich?
- Ich habe eine wachsende Menge von Ordnern, die allesamt mit einem Datum benannt sind. Beispiel: 2018-12-31
- Die Ordner haben wirklich nur das Datum als Ordnernamen in der Formatierung wie oben, also YYYY-MM-DD
- Das System (Windows Server 2008 R2) und Regionaleinstellungen sind deutsch
- Powershell V 4.0
Was brauche ich?
- Ich will anhand des Namens den aktuellsten Ordner identifizieren. Die Namen werden unabhängig von der tatsächlichen Erstellungs- oder Änderungszeit erzeugt, die für mich maßgebliche Info steht im Ordnernamen, nicht in den Eigenschaften.
Wie weit komme ich?
- Ich lade alle Ordnernamen in ein Array.
Wo hängt es?
- Ich kriege es nicht hin, die einzelnen Einträge in ein Datum zu konvertieren. Wenn ich mit ParseExact arbeite, bekomme ich die Meldung, dass das Ausgangsformat nicht korrekt wäre. Mit einer selbstgeklauten Funktion "ConvertStringDate", die ich im Internet gefunden habe, bekomme ich leere Ergebnisse. Ja, natürlich habe ich die auf meine Umgebung angepasst
Hat jemand eine Idee für mich, wie ich das gelöst bekomme?
Gruß
Jörg
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 389016
Url: https://administrator.de/contentid/389016
Ausgedruckt am: 24.11.2024 um 15:11 Uhr
11 Kommentare
Neuester Kommentar
Servus Joerg,
Die Macht der Kraftmuschel sei mit dir .
Grüße Uwe
Hat jemand eine Idee für mich, wie ich das gelöst bekomme?
nicht weiter schwer, mit sort-object kannst du dann noch direkt nach dem Datum sortieren ohne irgendwelche Arraysgci "D:\DeinRootOrdner" -Directory | ?{$_.Name -match '^\d{4}-\d{2}-\d{2}$'} | sort {[Datetime]::Parse($_.Name,[cultureinfo]::GetCultureInfo('en-US'))} -Descending | select -First 1
Grüße Uwe
Moin,
das ist ganz einfach:
hth
Erik
Zitat von @YotYot:
Wo hängt es?
- Ich kriege es nicht hin, die einzelnen Einträge in ein Datum zu konvertieren. Wenn ich mit ParseExact arbeite, bekomme ich die Meldung, dass das Ausgangsformat nicht korrekt wäre. Mit einer selbstgeklauten Funktion "ConvertStringDate", die ich im Internet gefunden habe, bekomme ich leere Ergebnisse. Ja, natürlich habe ich die auf meine Umgebung angepasst
Wo hängt es?
- Ich kriege es nicht hin, die einzelnen Einträge in ein Datum zu konvertieren. Wenn ich mit ParseExact arbeite, bekomme ich die Meldung, dass das Ausgangsformat nicht korrekt wäre. Mit einer selbstgeklauten Funktion "ConvertStringDate", die ich im Internet gefunden habe, bekomme ich leere Ergebnisse. Ja, natürlich habe ich die auf meine Umgebung angepasst
das ist ganz einfach:
get-childitem -directory | %{get-date -date $_.name}
hth
Erik
Wenn, ja wenn wirklich alle Ordner dem Schema entsprechen und die Locale passt, ansonsten mit Fehlermeldungen überschüttet .
Zitat von @colinardo:
Wenn, ja wenn wirklich alle Ordner dem Schema entsprechen und die Locale passt, ansonsten mit Fehlermeldungen überschüttet .
Wenn, ja wenn wirklich alle Ordner dem Schema entsprechen und die Locale passt, ansonsten mit Fehlermeldungen überschüttet .
Das hat der TO ja gesagt, dass das so ist. Ich vermute mal, dass die automatisiert erstellt werden.
Zitat von @erikro:
Das hat der TO ja gesagt, dass das so ist. Ich vermute mal, dass die automatisiert erstellt werden.
Hoffen wir's denn das folgende Kommentar:Das hat der TO ja gesagt, dass das so ist. Ich vermute mal, dass die automatisiert erstellt werden.
Wenn ich mit ParseExact arbeite, bekomme ich die Meldung, dass das Ausgangsformat nicht korrekt wäre.
lässt eine Vermutung zu das da ein paar Ordner als Querschläger drin sind (Leerzeichen & Co.) wenn er nicht mit der Syntax Misst gebaut hat (sehen wir ja leider nicht).Aber Vorsicht ist die Mutter der Porzellan-Kiste .
Zitat von @YotYot:
Das mit dem -match muss ich mir mal genauer anschauen, was da passiert. Erinnert mich ein wenig an Javascript.
Das nennt sich Regular Expression und es filtert die Ordner aus die der benötigten Syntax entsprechen.Das mit dem -match muss ich mir mal genauer anschauen, was da passiert. Erinnert mich ein wenig an Javascript.
Für eine detailliertere Beschreibung der mächtigen Syntax siehe
Regular Expressions Tutorial
Ist auf jeden Fall empfehlenswert das im Repertoire zu haben, das brauche ich täglich und in so gut wie jeder Programmier- oder Skriptsprache.
Obiger Pattern
^\d{4}-\d{2}-\d{2}$
Assert position at the beginning of a line «^»
Match a single character that is a “digit” «\d{4}»
Exactly 4 times «{4}»
Match the character “-” literally «-»
Match a single character that is a “digit” «\d{2}»
Exactly 2 times «{2}»
Match the character “-” literally «-»
Match a single character that is a “digit” «\d{2}»
Exactly 2 times «{2}»
Assert position at the end of a line «$»
Nee . Die Beschreibung macht hier "RegexBuddy" aus dem Pattern automatisch.
Natürlich kann man es jetzt bis auf die Spitze treiben indem man mit TryParse() wirklich noch auf ein gültiges Datum testet wenn z.B. jemand absichtlich ein Datum wie 2012-13-01 platziert
Das augenscheinlich gleiche Ergebnis Deiner viel besseren Lösung habe ich z.B. mit Where -like "20??-??-??" erzeugt.
Geht natürlich auch.Natürlich kann man es jetzt bis auf die Spitze treiben indem man mit TryParse() wirklich noch auf ein gültiges Datum testet wenn z.B. jemand absichtlich ein Datum wie 2012-13-01 platziert
Zitat von @colinardo:
Natürlich kann man es jetzt bis auf die Spitze treiben indem man wirklich noch auf ein gültiges Datum testet wenn z.B. jemand absichtlich ein Datum wie 2012-13-01 platziert
Natürlich kann man es jetzt bis auf die Spitze treiben indem man wirklich noch auf ein gültiges Datum testet wenn z.B. jemand absichtlich ein Datum wie 2012-13-01 platziert
Dann doch lieber ein try-catch mit get-date
Kommt alles aus dem .NET ist also piepe und nur Geschmackssache denn in TryParse ist das Try-Catch schon inkludiert:
gci "D:\Ordner" -Directory | ?{[datetime]$d = [datetime]::MinValue;[datetime]::TryParse($_.Name,[ref]$d)} | sort {[Datetime]::Parse($_.Name,[cultureinfo]::GetCultureInfo('en-US'))} -Descending | select -First 1