Sommerzeit-EXIF automatisch korrigieren mit PowerShell
Ein häufiges Problem bei Digitalkameras: Die Sommerzeit ist noch in der Kamera aktiviert, obwohl bereits Winterzeit ist. Die Zeitstempel in den Fotos sind dadurch eine Stunde falsch und das fällt oft erst später auf, wenn man die Bilder sortiert oder mit anderen Fotos abgleicht.
Viele Kameras speichern die Sommerzeit-Einstellung in den EXIF-Daten. Bei Nikon-Kameras findet sich das "Daylight Savings"-Flag in den MakerNotes. Solange dieses auf "Yes" steht, sind die Zeitstempel um eine Stunde vorgestellt.
Das PowerShell-Script durchsucht alle Bilddateien (z.B. NEF bei Nikon), prüft ob das Sommerzeit-Flag noch aktiv ist, und korrigiert dann:
Die EXIF-Zeitstempel werden um 1 Stunde zurückgestellt
Das Sommerzeit-Flag wird deaktiviert
Die Windows-Datei-Zeitstempel (Erstellt/Geändert) werden angepasst.
Das Script nutzt das kostenlose Tool exiftool und zeigt für jede Datei übersichtlich an, was geändert wurde. Dateien mit bereits korrekter Zeit werden einfach übersprungen.
Der exiftool-Pfad ist oben im Script konfigurierbar. Einfach das Script im Foto-Ordner ausführen. Unterordner werden automatisch durchsucht.
Das Ergebnis: Konsistente, korrekte Zeitstempel in allen Fotos, ohne manuelle Arbeit.
# PowerShell Script zur Korrektur der Sommerzeit in NEF-Dateien
# Stellt die EXIF-Zeit um eine Stunde vor für Dateien, die Sommerzeit in Nikon MakerNotes haben
# Testaufruf um DaylightSavings auszulesen:
# C:\tools\exiftool -DaylightSavings DSC_1234.NEF
# Daylight Savings : No
# ===== KONFIGURATION =====
$exiftoolPath = "C:\tools\exiftool"
# =========================
# Pfad zum aktuellen Verzeichnis
$baseDir = $PSScriptRoot
# Alle NEF-Dateien finden
$nefFiles = Get-ChildItem -Path $baseDir -Recurse -Filter "*.NEF"
Write-Host "Gefundene NEF-Dateien: $($nefFiles.Count)" -ForegroundColor Cyan
$correctedCount = 0
$skippedCount = 0
foreach ($file in $nefFiles) {
Write-Host "`nPrüfe: $($file.FullName)" -ForegroundColor Yellow
try {
# Lese Nikon Daylight Savings Flag aus MakerNotes
$daylightSavings = & $exiftoolPath -s -s -s -DaylightSavings $file.FullName 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Host "⚠ Konnte MakerNotes nicht lesen" -ForegroundColor DarkYellow
$skippedCount++
continue
}
Write-Host "Daylight Savings: $daylightSavings" -ForegroundColor Cyan
# Prüfe, ob Sommerzeit aktiviert ist (Yes oder On)
if ($daylightSavings -match "Yes|On") {
Write-Host "→ Sommerzeit ist aktiviert - Korrektur erforderlich" -ForegroundColor Magenta
# Zeige aktuelle Zeit
$currentTime = & $exiftoolPath -s -s -s -DateTimeOriginal $file.FullName
Write-Host "Aktuelle Zeit: $currentTime" -ForegroundColor White
# Stellt die Zeit um 1 Stunde zurück (-1 Stunde)
# -AllDates betrifft DateTimeOriginal, CreateDate und ModifyDate
Write-Host "Stelle Zeit um 1 Stunde zurück und setze Sommerzeit zurück..." -ForegroundColor Magenta
& $exiftoolPath -AllDates-=1:0:0 -DaylightSavings=No -overwrite_original $file.FullName 2>&1 | Out-Null
if ($LASTEXITCODE -eq 0) {
$newTime = & $exiftoolPath -s -s -s -DateTimeOriginal $file.FullName
$newDST = & $exiftoolPath -s -s -s -DaylightSavings $file.FullName
Write-Host "✓ Erfolgreich aktualisiert: $newTime" -ForegroundColor Green
Write-Host " Sommerzeit jetzt: $newDST" -ForegroundColor Green
# Setze Windows-Datei-Zeitstempel auf korrigierte EXIF-Zeit
try {
$exifDateTime = [DateTime]::ParseExact($newTime, "yyyy:MM:dd HH:mm:ss", $null)
$file.CreationTime = $exifDateTime
$file.LastWriteTime = $exifDateTime
Write-Host " Datei-Zeitstempel aktualisiert" -ForegroundColor Green
} catch {
Write-Host " ⚠ Konnte Datei-Zeitstempel nicht setzen: $_" -ForegroundColor DarkYellow
}
$correctedCount++
} else {
Write-Host "✗ Fehler beim Aktualisieren" -ForegroundColor Red
}
<#
#>
} else {
Write-Host "→ Keine Sommerzeit - wird übersprungen" -ForegroundColor Gray
$skippedCount++
}
}
catch {
Write-Host "✗ Fehler: $_" -ForegroundColor Red
Write-Host "Stelle sicher, dass exiftool installiert ist und im PATH verfügbar ist." -ForegroundColor Yellow
break
}
}
Write-Host "`n=== Fertig ===" -ForegroundColor Cyan
Write-Host "Korrigierte Dateien: $correctedCount" -ForegroundColor Green
Write-Host "Übersprungene Dateien: $skippedCount" -ForegroundColor Gray
Write-Host "Gesamt geprüft: $($nefFiles.Count)" -ForegroundColor Cyan