Neue Version berücksichtigt auch Exif-Daten und lässt alle Bilder in einem Ordner mit datum als Name
This commit is contained in:
89
bilder_und_videos_sortieren_v2.ps1
Normal file
89
bilder_und_videos_sortieren_v2.ps1
Normal 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
|
||||||
Reference in New Issue
Block a user