alexander01
Goto Top

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):
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

Content-Key: 5956993804

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

Printed on: April 28, 2024 at 03:04 o'clock

Mitglied: 5175293307
5175293307 Feb 12, 2023, updated at Feb 13, 2023 at 15:48:57 (UTC)
Goto Top
Täglich grüßt die Umbenenn-Fee ....
$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++
    }
}
Wurstel
Member: alexander01
alexander01 Feb 12, 2023 at 19:27:37 (UTC)
Goto Top
6 Zeilen, unglaublich.
Ich probiere es aus und melde mich.
Vielen Dank!!
Alexander
Member: alexander01
alexander01 Feb 13, 2023, updated at Feb 14, 2023 at 14:23:52 (UTC)
Goto Top
Hallo Wurstel,
kannst Du nochmal Hilfestellung geben?
Das Script lief nicht, PowerShell wurde sofort wieder geschlossen.
Ich habe Verschiedenes versucht, letztendlich klappte es , als ich -Recurse entfernt habe.
Nun noch 2 Kleinigkeiten, die erste ist wesentlich wichtiger:
Schön wäre, das sich wenn sich [zahl] innerhalb des Ordners oder auch in den Ordnern untereinander ändert, die Nummerierung der Dateien jeweils wieder bei 1 beginnt.
also:

zahl1
zahl1_001
zahl1_002
zahl2
zahl2_001
zahl2_002

hier soll also bei "zahl2" die Nummerierung wieder bei 1 beginnen
die zweite Kleinigkeit:
der jeweils erste Dateiname trägt (leider) keine Nachsilbe.
Hier stimmt die Umbenennung nicht. Die Endung .jpg steht nach der Umwandlung unmittelbar hinter [zahl].
also z.b. zahl1.jpg-2016-03-17
Hast Du noch eine Idee?
Das erste Problem muß man sicher mit einer Schleife lösen, deren Zähler sich auf "1" stellt, wenn sich [zahl] ändert.
Wie macht man das?

Danke!
Alexander
Member: alexander01
alexander01 Feb 14, 2023 at 06:44:47 (UTC)
Goto Top
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
liegt ein Schreibfehler vor?
Danke
Alexander
Mitglied: 3063370895
3063370895 Feb 14, 2023 at 06:46:53 (UTC)
Goto Top
Zitat von @alexander01:

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
liegt ein Schreibfehler vor?
Danke
Alexander

Poste doch mal das ganze Skript was du jetzt hast bitte. Und verwende Code-Tags
Member: alexander01
alexander01 Feb 14, 2023 at 07:56:00 (UTC)
Goto Top
gern:
# Pfad bitte anpassen
$source = "k:\test"  
$destination = "k:\ziel"  
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++
        
    }
    pause
}
Pause habe ich nur eingefügt, um die Fehlermeldungen lesen zu können.
Gruß
Alexander
Mitglied: 3063370895
3063370895 Feb 14, 2023 at 09:36:02 (UTC)
Goto Top
existiert der Ordner k:\ziel ?
Member: colinardo
colinardo Feb 14, 2023 updated at 09:48:20 (UTC)
Goto Top
Servus.
DirectoryNotFoundException
Da fehlt wohl nur der Zielordner, hast du wohl nur vergessen anzulegen face-wink. 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
Member: alexander01
alexander01 Feb 14, 2023 at 11:04:50 (UTC)
Goto Top
ich bin vielleicht irre, Zielordner war angelegt, jedoch als Unterverzeichnis. Korrigiert, keine Fehlermeldung mehr. Jedoch stimmt das Ergebnis nicht:

1500-2016-03-17-Image001
1500-2016-03-17-Image001-ziel-Image001
1500-2016-03-17-Image002
1500-2016-03-17-Image002-ziel-Image002
1500-2016-03-17-Image003
1500-2016-03-17-Image003-ziel-Image003
1500-2016-03-17-Image004
1500-2016-03-17-Image004-ziel-Image004
6996-2016-03-17-Image005
6996-2016-03-17-Image001-ziel-Image005
6996-2016-03-17-Image006
6996-2016-03-17-Image001-ziel-Image006
also immer 2 Ziel-Dateien, bei der 2. stimmt dann der Name nicht mehr.
Auch fängt das Script bei Änderung der Zahl (siehe weiter oben) mit dem Zähler nicht wieder bei "1" an.
bekommt man das noch besser hin?
Danke!
Alexander
Member: colinardo
colinardo Feb 14, 2023 updated at 11:25:59 (UTC)
Goto Top
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

screenshot

screenshot

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!
Member: alexander01
alexander01 Feb 14, 2023 at 11:27:28 (UTC)
Goto Top
... auch in ein und dem selben Order kann [zahl] verschieden sein.

Ordner: 2016-03-17
Files:
1500
1500-001
1500-002
1500-003
1500-004
6996
6996-001
6996-002
6996-003
Member: colinardo
Solution colinardo Feb 14, 2023 updated at 12:21:23 (UTC)
Goto Top
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 ...

$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++
        }
    }
}
#edit# Tippfehler korrigiert

back-to-topErgebnis

screenshot
Member: alexander01
alexander01 Feb 14, 2023 at 12:46:05 (UTC)
Goto Top
erst mal Danke für Deine Hilfe!
Hab jetzt das Script so übernommen, jetzt sieht der Inhalt des Zielordner's so aus:

1500-2016-03-17-Image0001
1500-2016-03-17-Image0002
1500-2016-03-17-Image0003
1500-2016-03-17-Image0004
1500-ziel-Image0001
1500-ziel-Image0002
1500-ziel-Image0003
1500-ziel-Image0004
6996-2016-03-17-Image0001
6996-2016-03-17-Image0002
6996-2016-03-17-Image0003
6996-2016-03-17-Image0004
6996-ziel-Image0001
6996-ziel-Image0002
6996-ziel-Image0003
6996-ziel-Image0004
Script erstellt also alle Zieldateien doppelt, benennt sie jedoch verschieden.
Alle Dateien mit "ziel" müssen quasi weg..., sonst passt es.
Gruß
Alexander
Member: colinardo
colinardo Feb 14, 2023 updated at 13:48:41 (UTC)
Goto Top
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 face-wink, das Skript selbst arbeitet wie es soll, hab ich ja getestet.
Member: alexander01
Solution alexander01 Feb 14, 2023 at 13:54:07 (UTC)
Goto Top
ok, ich teste, ich setze die Verzeichnisse anders.
Interessant (Loop), danke!
Grüße
Alexander
Member: alexander01
alexander01 Feb 14, 2023 at 13:56:17 (UTC)
Goto Top
funktioniert. Klasse.
Ganz große Dank (Euch allen) !
Alexander
Member: colinardo
colinardo Feb 14, 2023 updated at 14:21:12 (UTC)
Goto Top
Immer gerne 👍

Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.