Neue Version berücksichtigt auch Exif-Daten und lässt alle Bilder in einem Ordner mit datum als Name

This commit is contained in:
2024-11-29 23:50:06 +01:00
parent ece63f511b
commit 077d7fc36c

View File

@@ -0,0 +1,89 @@
# Ordnerpfad angeben
$sourceFolder = Read-Host -Prompt "Bitte geben Sie den Pfad des Quellordners an"
# Ordnerpfade für Bilder, Videos und Duplikate angeben
$imagesFolder = Join-Path -Path $sourceFolder -ChildPath "Bilder"
$videosFolder = Join-Path -Path $sourceFolder -ChildPath "Videos"
$duplicatesImagesFolder = Join-Path -Path $imagesFolder -ChildPath "Duplikate"
$duplicatesVideosFolder = Join-Path -Path $videosFolder -ChildPath "Duplikate"
# Überprüfen, ob die Quellordner existieren, andernfalls erstellen
foreach ($folder in @($imagesFolder, $videosFolder, $duplicatesImagesFolder, $duplicatesVideosFolder)) {
if (-Not (Test-Path -Path $folder)) {
New-Item -Path $folder -ItemType Directory | Out-Null
}
}
# Alle Bild- und Videodateien im Ordner abrufen
$files = Get-ChildItem -Path $sourceFolder -Recurse -File | Where-Object { $_.Extension -in '.jpg', '.jpeg', '.png', '.gif', '.bmp', '.mp4', '.mov', '.avi', '.mkv' }
# Hashtable zum Speichern von Hashes der Dateien
$hashTableImages = @{}
$hashTableVideos = @{}
# Funktion zum Extrahieren von EXIF-Daten
function Get-ExifDate($file) {
try {
$shell = New-Object -COMObject Shell.Application
$folder = $shell.Namespace($file.DirectoryName)
$item = $folder.ParseName($file.Name)
$dateTaken = $folder.GetDetailsOf($item, 12) # 12 is the index for "Date taken"
if ($dateTaken) {
return [DateTime]::ParseExact($dateTaken, "dd.MM.yyyy HH:mm", $null)
}
} catch {
Write-Host "Fehler beim Lesen der EXIF-Daten für $($file.Name): $_" -ForegroundColor Red
}
return $null
}
foreach ($file in $files) {
# EXIF-Datum abrufen
$exifDate = Get-ExifDate $file
# Früheres Datum zwischen EXIF-Datum, Erstelldatum und Änderungsdatum abrufen
$creationDate = (Get-Item $file.FullName).CreationTime
$lastWriteDate = (Get-Item $file.FullName).LastWriteTime
$dateToUse = if ($exifDate) { $exifDate } elseif ($creationDate -lt $lastWriteDate) { $creationDate } else { $lastWriteDate }
# Jahr und Monat aus dem zu verwendenden Datum extrahieren
$year = $dateToUse.ToString('yyyy')
$month = $dateToUse.ToString('MM')
# Neuen Dateinamen erstellen
$newFileName = $dateToUse.ToString('yyyy-MM-dd_HH-mm-ss') + $file.Extension
# Zielunterordner nach Jahr und Monat erstellen, abhängig vom Dateityp
if ($file.Extension -in '.jpg', '.jpeg', '.png', '.gif', '.bmp') {
$targetFolder = Join-Path -Path $imagesFolder -ChildPath "$year\$month"
$hashTable = $hashTableImages
$duplicatesFolder = $duplicatesImagesFolder
} elseif ($file.Extension -in '.mp4', '.mov', '.avi', '.mkv') {
$targetFolder = Join-Path -Path $videosFolder -ChildPath "$year\$month"
$hashTable = $hashTableVideos
$duplicatesFolder = $duplicatesVideosFolder
} else {
continue
}
if (-Not (Test-Path -Path $targetFolder)) {
New-Item -Path $targetFolder -ItemType Directory | Out-Null
}
# Datei-Hash berechnen, um Duplikate zu identifizieren
$hash = (Get-FileHash -Path $file.FullName -Algorithm MD5).Hash
if ($hashTable.ContainsKey($hash)) {
# Datei ist ein Duplikat, in den entsprechenden Duplikate-Ordner kopieren
$duplicateDestination = Join-Path -Path $duplicatesFolder -ChildPath $newFileName
Copy-Item -Path $file.FullName -Destination $duplicateDestination
Write-Host "Duplikat '$($file.Name)' wurde nach '$duplicatesFolder' als '$newFileName' kopiert." -ForegroundColor Yellow
} else {
# Datei ist kein Duplikat, in den Zielordner kopieren
$hashTable[$hash] = $file.FullName
$destinationPath = Join-Path -Path $targetFolder -ChildPath $newFileName
Copy-Item -Path $file.FullName -Destination $destinationPath
Write-Host "Datei '$($file.Name)' wurde nach '$targetFolder' als '$newFileName' kopiert." -ForegroundColor Green
}
}
Write-Host "Alle Dateien wurden erfolgreich in entsprechende Unterordner kopiert. Duplikate wurden in die entsprechenden Duplikate-Ordner kopiert." -ForegroundColor Cyan