Umbenennen von Dateinamen mit PowerShell
Hallo,
ich habe eine Frage zur Erstellung eines PowerShell-Scriptes zur automatisierten Umbenennung von Dateien.
In einem Ordner gibt es viele Unterordner, alle benannt nach dem Schema:
yyyy-mm-tt, also z.B. 2016-03-17
In jedem dieser Ordner liegen Bild-Dateien.
Diese sind benannt nach dem Schema (Trennung = Unterstrich):
manchmal gibt es in einem Ordner auch noch zusätzlich:
ich möchte, das alle Bild-Dateien (egal, in welchem Datums-Ordner sie liegen), in einem Verzeichnis gespeichert werden und zwar nach der Regel:
zahl[xyz]-[Ordner-Name]-Image[lfd.Nr.]
(Trennung = Bindestrich)
Beispiel:
zahl2-2016-03-17-Image1
Im Prinzip also Abfrage von Namen (der Ordner und der darin befindlichen Dateien), Aufspalten der Dateinamen und Neugruppierung aller Variablen.
Aus einer früheren Frage und einem mit Eurer Hilfe erstelltem Script kann man ja einen ersten Teil verwenden:
Kann mir hier jemand weiterhelfen?
Vielen Dank!
Alexander
ich habe eine Frage zur Erstellung eines PowerShell-Scriptes zur automatisierten Umbenennung von Dateien.
In einem Ordner gibt es viele Unterordner, alle benannt nach dem Schema:
yyyy-mm-tt, also z.B. 2016-03-17
In jedem dieser Ordner liegen Bild-Dateien.
Diese sind benannt nach dem Schema (Trennung = Unterstrich):
zahl1
zahl1_001
zahl1_002 usw.
manchmal gibt es in einem Ordner auch noch zusätzlich:
zahl2
zahl2_001
zahl2_002
ich möchte, das alle Bild-Dateien (egal, in welchem Datums-Ordner sie liegen), in einem Verzeichnis gespeichert werden und zwar nach der Regel:
zahl[xyz]-[Ordner-Name]-Image[lfd.Nr.]
(Trennung = Bindestrich)
Beispiel:
zahl2-2016-03-17-Image1
Im Prinzip also Abfrage von Namen (der Ordner und der darin befindlichen Dateien), Aufspalten der Dateinamen und Neugruppierung aller Variablen.
Aus einer früheren Frage und einem mit Eurer Hilfe erstelltem Script kann man ja einen ersten Teil verwenden:
$root = 'L:\studies'
$batch = 0
# Abfrage aller Ordner der ersten Ebene im Root-Ordner
ls $root -Directory | %{
# alle 100 Ordner anhalten und fragen
if ($batch % 100 -eq 0){
Read-Host "`nEnter drücken zum fortfahren für den nächsten Batch an Ordnern"
}
Kann mir hier jemand weiterhelfen?
Vielen Dank!
Alexander
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 5956993804
Url: https://administrator.de/forum/umbenennen-von-dateinamen-mit-powershell-5956993804.html
Ausgedruckt am: 08.02.2025 um 20:02 Uhr
17 Kommentare
Neuester Kommentar
![5175293307](/images/members/profile_male_48x48.png)
Täglich grüßt die Umbenenn-Fee ....
Wurstel
$source = "d:\source"
$destination = "e:\destination"
foreach($folder in Get-ChildItem $source -Directory){
$cnt = 1
foreach($file in Get-ChildItem $folder.Fullname -File) {
copy-item $file.Fullname -Destination "$destination\$($file.Basename.split('_'))-$($folder.Name)-Image$('{0:D4}' -f $cnt)$($file.Extension)" -verbose
$cnt++
}
}
![3063370895](/images/members/profile_male_48x48.png)
Zitat von @alexander01:
Danke erst mal für die Anpassung!
es kommt jetzt bei allen Dateien folgende Fehlermeldung:
liegt ein Schreibfehler vor?
Danke
Alexander
Danke erst mal für die Anpassung!
es kommt jetzt bei allen Dateien folgende Fehlermeldung:
AUSFÜHRLICH: Ausführen des Vorgangs "Datei kopieren" für das Ziel "Element: K:\test\2016-03-23\11428_015.jpg Ziel: K:\ziel\11428-2016-03-23-Image0016.jpg".
> copy-item : Ein Teil des Pfades "K:\ziel\11428-2016-03-23-Image0016.jpg" konnte nicht gefunden werden.
> In C:\Users\User\Desktop\Umbenennen.ps1:7 Zeichen:9
> + copy-item $file.Fullname -Destination "$destination\$($file.B ...
> + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> + CategoryInfo : NotSpecified: (:) [Copy-Item], DirectoryNotFoundException
> + FullyQualifiedErrorId : System.IO.DirectoryNotFoundException,Microsoft.PowerShell.Commands.CopyItemCommand
Danke
Alexander
Poste doch mal das ganze Skript was du jetzt hast bitte. Und verwende Code-Tags
![3063370895](/images/members/profile_male_48x48.png)
existiert der Ordner k:\ziel ?
Servus.
. Oder lass es das Skript erledigen bspw. mit
Grüße Uwe
DirectoryNotFoundException
Da fehlt wohl nur der Zielordner, hast du wohl nur vergessen anzulegen $source = "d:\source"
$destination = "e:\destination"
if (!(Test-Path $destination)){md $destination -Force | out-null}
# ...
Pause habe ich nur eingefügt, um die Fehlermeldungen lesen zu können.
Du kannst an den copy-item Befehl jederzeit hinten ein -whatif anhängen, dann schreibt die Powershell nur auf die Konsole was es machen würde, ohne es tatsächlich auszuführen (Simulationsmodus), für Tests immer sehr nützlich.Grüße Uwe
Also hier funktioniert es wie gewünscht mit dem Ergebnis wie du es oben geschildert hast, sehe im Skript auch diesbezüglich keinen Fehler, der Zähler wird ja pro Ordner wieder zurückgesetzt wie du ja in der ersten Schleife in Zeile 5 gut sehen kannst:
Hier das Ergebnis aus meinem Test:
![screenshot - ed7d46e6f4e74b0f4c819aa930ad06aa screenshot](/images/c/2023/02/14/ed7d46e6f4e74b0f4c819aa930ad06aa.jpg)
![screenshot - 19329b9546e6f2422f2544e65ad8f5f4 screenshot](/images/c/2023/02/14/19329b9546e6f2422f2544e65ad8f5f4.jpg)
Es wäre ja mal sinnvoll ein paar Files des Quellorders zu nennen und wie diese tatsächlich aussehen. Du wirst uns da höchstwahrscheinlich etwas verschwiegen haben.
Den Zielordner solltest du natürlich bei deinen Test nach jedem Ausführen immer wieder vorher leeren!
Hier das Ergebnis aus meinem Test:
![screenshot - ed7d46e6f4e74b0f4c819aa930ad06aa screenshot](/images/c/2023/02/14/ed7d46e6f4e74b0f4c819aa930ad06aa.jpg)
![screenshot - 19329b9546e6f2422f2544e65ad8f5f4 screenshot](/images/c/2023/02/14/19329b9546e6f2422f2544e65ad8f5f4.jpg)
Es wäre ja mal sinnvoll ein paar Files des Quellorders zu nennen und wie diese tatsächlich aussehen. Du wirst uns da höchstwahrscheinlich etwas verschwiegen haben.
Den Zielordner solltest du natürlich bei deinen Test nach jedem Ausführen immer wieder vorher leeren!
OK, aber deine Files nutzen nicht den Unterstrich sondern den Dash als Trenner, den hattest du oben definiert, den musst du dann anpassen oder wir definieren mehrere Trenner, das musst du schon spezifizieren. Alternativ können wir hier auch nur Digits am Anfang extrahieren wie du halt willst du musst es uns nur sagen ...
#edit# Tippfehler korrigiert
![screenshot - 16dff14265cf9dec71a613158c18fcad screenshot](/images/c/2023/02/14/16dff14265cf9dec71a613158c18fcad.jpg)
$source = "k:\test"
$destination = "k:\ziel"
if (!(Test-Path $destination)){md $destination -Force | out-null}
foreach($folder in Get-ChildItem $source -Directory){
foreach($group in Get-ChildItem $folder.Fullname -File | group {($_.Basename -split '[-_]')} ) {
$cnt = 1
foreach($file in $group.Group){
copy-item $file.Fullname -Destination "$destination\$($group.Name)-$($folder.Name)-Image$('{0:D4}' -f $cnt)$($file.Extension)" -verbose
$cnt++
}
}
}
Ergebnis
![screenshot - 16dff14265cf9dec71a613158c18fcad screenshot](/images/c/2023/02/14/16dff14265cf9dec71a613158c18fcad.jpg)
Script erstellt also alle Zieldateien doppelt, benennt sie jedoch verschieden.
Nein kann aus Prinzip nicht sein, das liegt dann an deinen Ordner-Struktur.Du hast dir da bei dir selbst mit den angegebenen Ordnern einen Loop gebaut weil das "ziel"deines Zielordners im Namen ist
Immer gerne 👍
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.