Powershell String zerlegen nach Zeichen
Hallo,
ich sammle über Get-Childitem Dateinamen aus Verzeichnissen. Diese Dateinamen haben ein Format "Datum_Uhrzeit_Dateiname". Diesen String möchte ich gerne in die Felder Datum, Uhrzeit und Dateiname zerlegen. Wenn ich mit der Split() Methode herangehe, bekomme ich zwar den String zerlegt, aber wenn der Dateiname aus irgendwelchen Gründen ebenfalls einen Unterstrich besitzt, hätte ich ein Array welches statt drei auf einmal vier Werte besitzt.
Aus diesem Grund habe ich die Frage, ob es Möglich ist den Split lediglich auf die ersten beiden Unterstriche zu beschränken?
Gruß
derhoeppi
ich sammle über Get-Childitem Dateinamen aus Verzeichnissen. Diese Dateinamen haben ein Format "Datum_Uhrzeit_Dateiname". Diesen String möchte ich gerne in die Felder Datum, Uhrzeit und Dateiname zerlegen. Wenn ich mit der Split() Methode herangehe, bekomme ich zwar den String zerlegt, aber wenn der Dateiname aus irgendwelchen Gründen ebenfalls einen Unterstrich besitzt, hätte ich ein Array welches statt drei auf einmal vier Werte besitzt.
Aus diesem Grund habe ich die Frage, ob es Möglich ist den Split lediglich auf die ersten beiden Unterstriche zu beschränken?
Gruß
derhoeppi
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 399996
Url: https://administrator.de/contentid/399996
Ausgedruckt am: 05.11.2024 um 04:11 Uhr
2 Kommentare
Neuester Kommentar
Servus.
https://docs.microsoft.com/de-de/dotnet/api/system.string.split?view=net ...
oder du arbeitest mit Regex und Submatches.
Im Kontext mit Dateien kann man das z.B. mit dem Regex und einem Where-Object direkt in der Pipe nutzen
Grüße Uwe
Aus diesem Grund habe ich die Frage, ob es Möglich ist den Split lediglich auf die ersten beiden Unterstriche zu beschränken?
Ja, dafür hat die Split-Methode einen weiteren Parameter um die Anzahl der Splits zu begrenzen:https://docs.microsoft.com/de-de/dotnet/api/system.string.split?view=net ...
"eins_zwei_drei_vier".split("_",3)
$m = [regex]::match("eins_zwei_drei_vier",'^([^_]+)_([^_]+)_(.*)$')
$m.Groups[1].Value
$m.Groups[2].Value
$m.Groups[3].Value
Im Kontext mit Dateien kann man das z.B. mit dem Regex und einem Where-Object direkt in der Pipe nutzen
gci C:\Ordner -File | ?{$_.Basename -match '^([^_]+)_([^_]+)_(.*)$'} | %{
$part1 = $matches[1]
$part2 = $matches[2]
$part3 = $matches[3]
# .....
}
Du kannst auch mit dem -split Operator die Splits limitieren und direkt mehreren Variablen zuweisen:
Ausgabe:
Gruß
LotPings
$Date,$Time,$File = "2019-01-31_12.13.14_Datei_name.txt" -split '_',3
> $date
2019-01-31
> $time
12.13.14
> $file
Datei_name.txt
Get-ChildItem C:\Ordner\*_*_* -File | ForEach-Object {
$Date,$Time,$File = $_.Name -split '_',3
[PSCustomObject]@{
Date = $Date
Time = $Time
File = $File
}
}
Ausgabe:
Date Time File
---- ---- ----
2019-01-31 12.13.14 Datei_name.txt
LotPings