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-ID: 5956993804

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

Ausgedruckt am: 22.11.2024 um 14:11 Uhr

5175293307
5175293307 12.02.2023, aktualisiert am 13.02.2023 um 16:48:57 Uhr
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
alexander01
alexander01 12.02.2023 um 20:27:37 Uhr
Goto Top
6 Zeilen, unglaublich.
Ich probiere es aus und melde mich.
Vielen Dank!!
Alexander
alexander01
alexander01 13.02.2023, aktualisiert am 14.02.2023 um 15:23:52 Uhr
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
alexander01
alexander01 14.02.2023 um 07:44:47 Uhr
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
3063370895
3063370895 14.02.2023 um 07:46:53 Uhr
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
alexander01
alexander01 14.02.2023 um 08:56:00 Uhr
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
3063370895
3063370895 14.02.2023 um 10:36:02 Uhr
Goto Top
existiert der Ordner k:\ziel ?
colinardo
colinardo 14.02.2023 aktualisiert um 10:48:20 Uhr
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
alexander01
alexander01 14.02.2023 um 12:04:50 Uhr
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
colinardo
colinardo 14.02.2023 aktualisiert um 12:25:59 Uhr
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!
alexander01
alexander01 14.02.2023 um 12:27:28 Uhr
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
colinardo
Lösung colinardo 14.02.2023 aktualisiert um 13:21:23 Uhr
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
alexander01
alexander01 14.02.2023 um 13:46:05 Uhr
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
colinardo
colinardo 14.02.2023 aktualisiert um 14:48:41 Uhr
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.
alexander01
Lösung alexander01 14.02.2023 um 14:54:07 Uhr
Goto Top
ok, ich teste, ich setze die Verzeichnisse anders.
Interessant (Loop), danke!
Grüße
Alexander
alexander01
alexander01 14.02.2023 um 14:56:17 Uhr
Goto Top
funktioniert. Klasse.
Ganz große Dank (Euch allen) !
Alexander
colinardo
colinardo 14.02.2023 aktualisiert um 15:21:12 Uhr
Goto Top
Immer gerne 👍

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