xaero1982
Goto Top

Umbenennen von Dateien mit Ordnernamen und Unterordner

Moin Zusammen,

folgendes Problem:

Ich habe einen Ordner.
Nennen wir ihn "Fotos"

In diesem Ordner sind dann Zig Unterordner mit verschiedenen Namen z.B.

"20100925-Malediven"
In diesen Ordnern sind dann ganz viele Bilder die da heißen "IMG_xxx.JPG"

Nun kann es aber auch vorkommen, dass es einen Ordner

"Afrika" gibt und in diesem dann noch weitere Unterornder nach obigem Muster sind, also "20090312-Afrika".

Ich möchte nun gerne ALLE Bilder in den Unterordnern umbenennen in das Format:

"Ordnername_001.jpg"

Wenn noch jemand weiß, wie ich das Erstelldatum auslese und das gleich mit rein basteln kann wäre es super, ansonsten lass ich das von Lightroom machen. Das Erstelldatum soll auch in dem Format "YYYYMMDD" sein.

Ich hab mich natürlich schon dran versucht, aber ich komme mit den Ordnern und Unterordnern nicht zurecht. Die Batch in je ein Verzeichnis zu kopieren ist jetzt nicht so der Hammer :D

Danke im Voraus! face-smile

Content-ID: 278540

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

Ausgedruckt am: 26.11.2024 um 18:11 Uhr

colinardo
Lösung colinardo 28.07.2015 aktualisiert um 21:08:20 Uhr
Goto Top
Hallo Xaero,
das gewünschte macht dir folgendes Powershell-Script:
$folder = 'D:\Urlaubsbilder'  
gci $folder -Recurse | ?{$_.PSIsContainer} | %{
    $cnt = 1; $dir = $_.Name
    gci $_.Fullname -Filter *.jpg | sort CreationTime | %{
        rename-item $_.Fullname -NewName "$($dir)_$($_.CreationTime.ToString('yyyyMMdd'))_$($cnt.ToString().PadLeft(3,'0'))$($_.Extension)"  
        $cnt++
    }
}
Einfach den RootOrdner in der sich alle anderen Ordner befinden in ersten Zeile angeben und freuen.

Grüße Uwe
TlBERlUS
TlBERlUS 28.07.2015 aktualisiert um 11:02:36 Uhr
Goto Top
Hi,

datum muss ich noch reinbasteln, ansonsten kannst du ja mal testen.

 
clear-host
$path = "Pfad"  
cd $path
$arr = gci $path

foreach ($a in $arr){
$arr2 = gci -Path $path\$a -Recurse 
$counter = 0
foreach ($b in $arr2){
$counter = $counter+1
$b | Rename-Item -NewName "$a`_$counter.jpg"  
}
}

Edit: @colinardo mal wieder schneller und eleganter face-smile

Grüße,

Tiberius
beidermachtvongreyscull
beidermachtvongreyscull 28.07.2015 um 10:56:27 Uhr
Goto Top
Wäre es nicht möglich dazu ein Tool wie http://www.bulkrenameutility.co.uk/Main_Intro.php zu verwenden?
Damit kannst Du tolle Benennungsmuster erzeugen und diese auf große Datenmengen anwenden.
beidermachtvongreyscull
beidermachtvongreyscull 28.07.2015 um 10:58:10 Uhr
Goto Top
Es zeigt sich doch, wo die Power von Powershell liegt.
In VBscript wäre der Code wahrscheinlich komplizierter ausgefallen. face-smile
Xaero1982
Xaero1982 28.07.2015 um 12:25:42 Uhr
Goto Top
Ich danke euch schon mal face-smile

Ich werde es gleich mal testen face-smile

Danke!

Grüße
holli.zimmi
holli.zimmi 28.07.2015 um 14:24:18 Uhr
Goto Top
Hi,

aber denk dran, mach vorher eine Sicherung!

Gruß

Holli
colinardo
colinardo 28.07.2015 aktualisiert um 18:31:19 Uhr
Goto Top
aber denk dran, mach vorher eine Sicherung!
Zur Info : Müsste man nicht unbedingt, denn Powershell kennt den schönen Parameter -whatif der bei fast jedem CMDLet verfügbar ist und einem dann alles nur anzeigt was passieren würde, es aber nicht tatsächlich durchführt.
Fürs Testen sehr sehr Hilfreich face-smile
Xaero1982
Xaero1982 28.07.2015 aktualisiert um 21:12:55 Uhr
Goto Top
Schon passiert die Sicherung face-smile

Also im Test hat das so weit funktioniert, aber kannst du mir mal bitte erklären was du da genau machst in der Poweshell?

Offenbar muss man statt dem Erstelldatum, das Änderungsdatum nehmen? Denn ich habe einfach mal drei Bilder testweise in irgendwelche Ordner kopiert und dann steht dort das heutige Datum.
Edit: Gut, das Änderungsdatum ist dann auch wieder ein anderes. Gibt es nicht eins, was nicht bei jedem Anfassen geändert wird?

Thx face-smile
colinardo
colinardo 28.07.2015 aktualisiert um 21:42:09 Uhr
Goto Top
Zitat von @Xaero1982:
Also im Test hat das so weit funktioniert, aber kannst du mir mal bitte erklären was du da genau machst in der Poweshell?
Das Skript durchläuft alle Unterordner und für jeden Ordner speichert es sich erst mal den Namen in $dir, dann werden alle Bilder in dem Ordner durchlaufen entsprechend den Variablen umbenannt.

Offenbar muss man statt dem Erstelldatum, das Änderungsdatum nehmen? Denn ich habe einfach mal drei Bilder testweise in
irgendwelche Ordner kopiert und dann steht dort das heutige Datum.
Edit: Gut, das Änderungsdatum ist dann auch wieder ein anderes. Gibt es nicht eins, was nicht bei jedem Anfassen
geändert wird?
Das Erstelldatum ändert sich bei mir beim verschieben oder kopieren nicht kann aber je nach System passieren je nachdem was man damit veranstaltet, das Änderungsdatum ändert sich natürlich wenn man das Bild manipuliert.
Das sicherste ist natürlich das Auslesen des EXIF-Datums bei Bildern wenn sie denn eins enthalten. Das kann ich dir noch einbauen, für das Auslesen der erweiterten Daten einer Datei habe ich hier im Forum schon mal eine Funktion gepostet...
Erweiterte Dateieigenschaften mit Powershell-Funktion abfragen

Hier die Variante die das Exif-Datum ausließt und einbaut:

$folder = 'D:\Urlaubsbilder'  

# Funktion für das Auslesen der erweiterten Dateieigenschaften
function Add-ExtendedFileProperties{
    param(
        [Parameter(Mandatory=$true,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
        $fileItem,
        [String[]] $PropertyExtended = "ALL"  
    )
    begin
    {
        $shellObject = New-Object -Com Shell.Application
        $itemProperties = $null
    }

    process
    {
        if($fileItem.PsIsContainer)
        {
            $fileItem
            return
        }
        $directoryName = $fileItem.DirectoryName
        $filename = $fileItem.Name

        $folderObject = $shellObject.NameSpace($directoryName)
        $item = $folderObject.ParseName($filename)

        if(-not $itemProperties)
        {
            $itemProperties = @{}
            $counter = 0
            $columnName = ""  
            if ($PropertyExtended -eq "ALL"){  
                 #get all properties
                do {
                    $columnName = $folderObject.GetDetailsOf($folderObject.Items, $counter)
                    if($columnName) { $itemProperties[$counter] = $columnName }
                    $counter++
                }while($columnName)
            }else{
                #get user defined properties
                do {
                    $columnName = $folderObject.GetDetailsOf($folderObject.Items, $counter)
                    foreach($name in $PropertyExtended){
                        if ($columnName.toLower() -eq $name.toLower()){
                            $itemProperties[$counter] = $columnName
                        }
                    }
                    $counter++
                }while($columnName)
            }
        }

        foreach($itemProperty in $itemProperties.Keys)
        {
            $fileItem | Add-Member NoteProperty $itemProperties[$itemProperty] `
                $folderObject.GetDetailsOf($item, $itemProperty) -ErrorAction `
                SilentlyContinue
        }
        $fileItem
    }
}

# Bilder umbenennen

gci $folder -Recurse | ?{$_.PSIsContainer} | %{
    $cnt = 1; $dir = $_.Name
    gci $_.Fullname -Filter *.jpg | Add-ExtendedFileProperties -PropertyExtended 'Aufnahmedatum' | sort CreationTime | %{  
        # Exif-Datum von Sonderzeichen befreien die leider oft enthalten sind.
        $d = get-date ($_.Aufnahmedatum -replace '[^\d\.:\\ ]','') -F 'yyyyMMdd' -EA SilentlyContinue  
        # Konnte das Exif-Datum nicht in ein Datumsobjekt umgewandelt werden nehme das Erstelldatum der Datei.
        if (!$d){$_.CreationTime.toString('yyyyMMdd')}  
        # Umbenennung starten
        rename-item $_.Fullname -NewName "$($dir)_$($d)_$($cnt.ToString().PadLeft(3,'0'))$($_.Extension)"  
        $cnt++
    }
}
Vernwendung wie immer auf eigene Gefahr und Leben face-wink

Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Xaero1982
Xaero1982 28.07.2015 um 22:03:55 Uhr
Goto Top
Ich danke dir, Uwe face-smile