ixpashaxi
Goto Top

PowerShell Dateiname Zahlen entfernen

Guten Abend zusammen,
ich hänge jetzt seit Stunden an einem vermeintlich sehr einfachen Code.

Es geht darum, dass ich die bestimmte Zahlen aus mehreren .csv Dateinamen entfernt haben möchte.

Die Dateinamen sind immer wie folgt:
user_flight_report-2023_12_26_16_19_26.csv
user_theory_report-2023_12_25_16_19_26.csv

Dabei möchte ich gerne einfach "user_flight_report" als Dateiname behalten.

Ich habe bereits mit dem beigefügten PowerShell Code gearbeitet, allerdings löscht dieses aktuell nur die letzten 20 Zeichen
und ist damit recht Fehleranfällig.

$path = "C:\Users\XXX\Desktop\FDRZ"  
Get-ChildItem -path $path -Recurse -filter *.csv |
ForEach-Object {
$filename = $_.Name
Write-host $filename
Rename-Item -path $_.FullName -newname ($_.Name.substring(0,$_.basename.length -
20)+ $_.Extension)
}

Könnte jemand den Code bitte so pimpen, dass es die Zahlen 0-9 sowie "-" und "_" entfernt?

Am Ende möchte ich in knapp 100 Unterordnern nur die beiden CSV Dateien "User_flight_report.csv" & "User_theory_report.csv" übrig haben.
Das Ganze muss auch für nachfolgende Dateien funktionieren. D.h. wenn ich in ein paar Monaten weitere .csv Dateien hinzufüge, möchte ich auch hier nur einmal die Shell ausführen und die "neuen" Dateien sind gekürzt.

Vielen Dank!

Content-Key: 62010663079

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

Printed on: May 6, 2024 at 18:05 o'clock

Member: michi1983
michi1983 Dec 26, 2023 at 16:58:56 (UTC)
Goto Top
Hallo,

 # Set the path to the specific folder
$folderPath = "C:\Path\To\Your\Folder"  

# Get all CSV files recursively
$csvFiles = Get-ChildItem -Path $folderPath -Filter *.csv -Recurse

# Loop through each CSV file
foreach ($file in $csvFiles) {
    # Get the file name without the timestamp
    $newFileName = $file.BaseName -replace '-\d{4}_\d{2}_\d{2}_\d{2}_\d{2}_\d{2}', ''  
    
    # Construct the new file path
    $newFilePath = Join-Path -Path $file.Directory.FullName -ChildPath "$newFileName.csv"  
    
    # Rename the file
    Rename-Item -Path $file.FullName -NewName $newFilePath -Force
}

Keine Gewähr.

Gruß
Mitglied: 10138557388
10138557388 Dec 26, 2023 updated at 17:10:31 (UTC)
Goto Top
Get-ChildItem -LiteralPath "C:\Users\XXX\Desktop\FDRZ" -Recurse -File -filter "*-*.csv" | rename-item -newname {$_.Basename.split('-')[0] + $_.Extension} -verbose  
PJ.
Member: IxPashaxI
IxPashaxI Dec 26, 2023 at 17:10:37 (UTC)
Goto Top
Wow, wirklich krass wie schnell man hier Hilfe bekommt! Vielen Dank!

Das hat auf jeden Fall schon funktioniert. Allerdings, sobald ich eine neue Datei hinzufüge (welche wieder einen Timestamp hat) und das Script erneut ausführe, passiert gar nichts mehr.

Zusatz:
Hättest du noch eine clevere Idee, wie ich vor dem "user" noch den Ordernamen in dem sich diese Datei befindet, ergänzen kann?
Bsp:
Path = FDRZ\Instructor\ASH ; dann sollte am Ende "ASH_user_flight_report.csv" herauskommen
Mitglied: 10138557388
Solution 10138557388 Dec 26, 2023 updated at 17:16:02 (UTC)
Goto Top
Hättest du noch eine clevere Idee, wie ich vor dem "user" noch den Ordernamen in dem sich diese Datei befindet, ergänzen kann?
Get-ChildItem -LiteralPath "C:\Users\XXX\Desktop\FDRZ" -Recurse -File -filter "*-*.csv" | rename-item -newname {$_.Directory.Name + "_" + $_.Basename.split('-')[0] + $_.Extension} -verbose    
Member: IxPashaxI
IxPashaxI Dec 26, 2023 updated at 17:21:20 (UTC)
Goto Top
Zitat von @10138557388:

Hättest du noch eine clevere Idee, wie ich vor dem "user" noch den Ordernamen in dem sich diese Datei befindet, ergänzen kann?
Get-ChildItem -LiteralPath "C:\Users\XXX\Desktop\FDRZ" -Recurse -File -filter "*-*.csv" | rename-item -newname {$_.Directory.Name + "_" + $_.Basename.split('-')[0] + $_.Extension} -verbose    

Es kann so einfach sein.... face-smile
Member: IxPashaxI
IxPashaxI Dec 26, 2023 at 17:21:39 (UTC)
Goto Top
Vergiss es, ich bin schon voll daneben face-smile
Member: mayho33
mayho33 Dec 26, 2023 updated at 17:40:08 (UTC)
Goto Top
Hi,

um einzelne Zeichen in einem String zu entfernen verwendest du am besten ein REGEX-Character-Set [0-9-_].
so wird jedes einzelne Zeichen im String geprüft und es ist total egal wie oft es vorkommt und wo es sich befindet:
$regexOption = [System.Text.RegularExpressions.RegexOptions]::IgnoreCase
$path = "C:\Users\XXX\Desktop\FDRZ"    

Get-ChildItem -path $path -Recurse -filter "*.csv" |  
ForEach-Object {
    $new = $([Regex]::Replace($_.FullName, "([0-9-_])", "", $regexOption))  

    Write-Host "old Name: $($_.Name)"  
    Write-Host "new Name: $(($new -split '\\')[-1])"  

    Rename-Item -path $_.FullName -newname $new
}