diff --git a/bilder_und_videos_sortieren_v2.ps1 b/bilder_und_videos_sortieren_v2.ps1 new file mode 100644 index 0000000..e7349b2 --- /dev/null +++ b/bilder_und_videos_sortieren_v2.ps1 @@ -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