RenameFromExif.ps1

RenameFromExif.ps1

Ich habe einen Ordner mit Bildern, die mit verschiedenen Kameras aufgenommen wurden, und alle diese Bilder haben eine korrekteDatumUhrzeitOriginalEXIF-Tag gesetzt.

Nehmen wir eine Dateiliste wie diese an:

20150831_153712.jpg
IMG_5246.JPG
IMG_5247.JPG
20150902_201425.jpg

Nun möchte ich wissen, wie ich diese Dateien auf diese Weise umbenennen kann, basierend auf derDatumUhrzeitOriginalTag natürlich:

001_IMG_5246.JPG
002_20150831_153712.jpg
003_IMG_5247.JPG
004_20150902_201425.jpg

Grundsätzlich möchte ichExiftool(oder ein Windows-Batchprogramm, wenn das nicht direkt möglich ist) umSortierenden gesamten Ordner mit JPEGs vonDatumUhrzeitOriginalaufsteigend und die Umbenennung sollte eineSchalterPräfix vor dem Dateinamen (wodurch der ursprüngliche Dateiname erhalten bleibt).

Ich würde auch gerne wissen, wie manTestbefehl zur Vorschau der Umbenennungbevor es auftritt (um zu sehen, ob etwas nicht stimmt, nehme ich an, mit demTestnameEtikett).

Antwort1

Die Elemente, die Sie mit ExifTool verwenden möchten, sind die -FileOrderOptionen und das FileSequenceTag sowie ein wenig Perl mit der erweiterten Formatierungsoption. Die Option FileOrder sortiert die Dateien basierend auf der Zeit, die Sie mit der Option angeben. Dies verlangsamt ExifTool ein wenig, da es jede Datei zweimal lesen muss, ist aber normalerweise immer noch schneller als andere Optionen, wie z. B. Schleifen und Aufrufen von ExifTool für jede Schleife. Das FileSequence-Tag ist intern für ExifTool und verfolgt die Nummer der aktuell verarbeiteten Datei. Es beginnt bei 0, daher müssen wir bei der erweiterten Verarbeitung 1 hinzufügen. Dort füllen wir auch die Nullen auf, sodass es mindestens 3 Zeichen sind.

Versuchen Sie diesen Befehl:
ExifTool "-TestName<${FileSequence;$_=0 x(3-length($_+1)).($_+1)}_$filename" -FileOrder DateTimeOriginal DIR

Wenn es funktioniert, ersetzen Sie es einfach -TestNamedurch -FileName:
ExifTool "-FileName<${FileSequence;$_=0 x(3-length($_+1)).($_+1)}_$filename" -FileOrder DateTimeOriginal DIR

Um die Anzahl der aufgefüllten Nullen zu ändern, ändern Sie die 3 in 3-lengthin die gewünschte Zahl. Um die Startzahl zu ändern, ändern Sie die 1 in $_+1.

Antwort2

Ich habe ein paar Umbenennungstools überprüft. Das Hauptproblem ist, dass Tools wieMaster umbenennenUndExifToolkann auf EXIF-Daten zugreifen. Ich konnte jedoch keine Möglichkeit finden, eine nummerierte Liste zu erstellen.

Also habe ich ein PowerShell-Skript geschrieben, um dies zu tun. Ich habe jede Zeile kommentiert. Es sollte leicht zu verstehen sein. Lesen Sie sie einfach.

Als erstes musste ich dieID von „DateTimeOriginal“also können wir verwenden GetPropertyItem(MyExifID). Als nächstes fügen wir alle Bilder aus einem bestimmten Ordner, die tatsächlich ein DateTimeOriginal haben, zu einem Array hinzu. Von hier aus war es einfach. Wir sortieren das Array nach Datumsspalte, erhöhen einen einfachen Zähler und erstellen unseren neuen Dateinamen mit dem Muster 000_oldname.

Dieses Skript ändert nichts.Es wird nur etwas wie Folgendes ausgegeben:

Bildbeschreibung hier eingeben

Verwenden Sie es, um zu prüfen, was das Skript tun würde. Nachdem Sie die möglichen Ergebnisse geprüft haben, entfernen Sie den Kommentarindikator #vor der Zeile #Rename-Item $_[0].Fullname $newName.Von nun an benennt das Skript Ihre Dateien entsprechend um.

RenameFromExif.ps1

# Set image folder to process
$strDirectory = "T:\Pictures"

# Create empty array
$arrSortMe = @()

# Load Windows library to access EXIF data
[void][Reflection.Assembly]::LoadWithPartialName("System.Drawing")

# Loop through all JPGs and JPEGs in the given image folder
Get-ChildItem -Path "$strDirectory\*" -Include *.jpg,*.jpeg | ForEach {

  # Load current image into Powershell as bitmap object
  $img = New-Object -TypeName system.drawing.bitmap -ArgumentList $_.FullName

  # Error handling for images which doesn't have the specified EXIF data
  Try {

    # Get EXIF data with ID 36867 - which is "DateTimeOriginal"
    $intExif = [Byte[]]$img.GetPropertyItem(36867).Value

    # Release image or else later we can't rename it
    $img.Dispose()

    # Convert EXIF data from byte array to string
    $strExif = [System.Text.Encoding]::Default.GetString($intExif, 0, $intExif.Length-1)

    # Convert EXIF data from string to datetime
    $dateExif = [DateTime]::ParseExact($strExif, 'yyyy:MM:dd HH:mm:ss', $null)

    # Add to multidimensional array: [0]=current_file  and [1]=datetime
    $arrSortMe += ,@($_, $dateExif)
  }
  Catch {}
}

Write-host "DateTimeTaken" `t`t`t "New Name" `t`t`t "Old Fullname"
# Sort array by datetime and pipe the sorted array to a foreach loop
$arrSortMe | Sort-Object @{Expression={$_[1]} } | ForEach {$i=0}{

    # Increment a simple counter starting with 0, so the first image gets the "1"
    $i++

    # Format the counter to 3-digits, append an underscore followed by the old image name
    $newName =  $i.ToString("000") + "_" + $_[0].Name    

    # Don't rename images which already have three digits as filename start
    If ($_.Name -notmatch "^[\d]{3}_") {
        #Rename-Item $_[0].Fullname $newName
    }

    # Only for debugging    
    Write-host $_[1].Date `t $newName `t $_[0].Fullname
}

# Clear all variables. System variables are readonly so we don't mind using * to get all
Remove-Variable * -ErrorAction SilentlyContinue

Verwendete Ressourcen

verwandte Informationen