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/contentid/5956993804
Ausgedruckt am: 22.11.2024 um 14:11 Uhr
17 Kommentare
Neuester Kommentar
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++
}
}
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
existiert der Ordner k:\ziel ?
Servus.
Grüße Uwe
DirectoryNotFoundException
Da fehlt wohl nur der Zielordner, hast du wohl nur vergessen anzulegen . Oder lass es das Skript erledigen bspw. mit$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:
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:
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
$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
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 , das Skript selbst arbeitet wie es soll, hab ich ja getestet.
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.