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
Please also mark the comments that contributed to the solution of the article
Content-Key: 399996
Url: https://administrator.de/contentid/399996
Printed on: April 26, 2024 at 13:04 o'clock
2 Comments
Latest comment
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