如何用PowerShell批量将照片‘拍摄日期’调整为匹配‘修改日期’
修正照片EXIF拍摄日期与修改日期同步的PowerShell脚本
你可以直接使用下面的整合代码,既保留修正文件LastWriteTime的原有逻辑,又同步更新照片的EXIF拍摄日期(对应属性ID 36867,即DateTimeOriginal字段):
# 加载处理图片EXIF所需的.NET程序集 Add-Type -AssemblyName System.Drawing # 指定你的照片目录路径 $targetDir = 'directory' # 遍历目录下的图片文件(可根据需要扩展扩展名) Get-ChildItem -Path $targetDir -File -Recurse -Include *.jpg,*.jpeg,*.png | ForEach-Object { # 第一步:修正文件的修改日期(保留你原有的逻辑) $correctedTime = $_.LastWriteTime.AddHours(-1) $_.LastWriteTime = $correctedTime # 第二步:同步更新EXIF拍摄日期 try { # 以只读模式打开图片,避免占用文件资源 $image = [System.Drawing.Image]::FromFile($_.FullName, $true) # 获取EXIF拍摄日期对应的属性项(ID 36867) $propItem = $image.GetPropertyItem(36867) # 将修正后的时间转换为EXIF要求的字符串格式:yyyy:MM:dd HH:mm:ss $timeString = $correctedTime.ToString("yyyy:MM:dd HH:mm:ss") # 把字符串转为字节数组(EXIF属性值以ASCII字节存储,末尾需加终止符) $propItem.Value = [System.Text.Encoding]::ASCII.GetBytes($timeString + [char]0) # 更新属性并保存图片 $image.SetPropertyItem($propItem) $image.Save($_.FullName) } catch { Write-Warning "处理文件 $($_.FullName) 失败:$($_.Exception.Message)" } finally { # 确保释放图片资源,避免文件被锁定 if ($image) { $image.Dispose() } } }
关键细节说明:
- 程序集加载:
Add-Type -AssemblyName System.Drawing用于调用.NET的图片处理类,实现EXIF属性的读写。 - 属性ID 36867:对应EXIF标准里的
DateTimeOriginal,就是照片的原始拍摄日期时间字段。 - 时间格式要求:EXIF规定拍摄日期必须使用
yyyy:MM:dd HH:mm:ss格式,不能用-分隔日期,否则会导致属性无法被正确识别。 - 资源释放:通过
try-finally块确保图片资源被及时释放,避免后续操作无法访问文件。 - 文件过滤:用
-Include指定目标图片扩展名,避免处理非图片文件,若你的照片还有其他格式(如*.raw),可自行添加。
注意事项:
- 操作前建议先备份少量照片测试,避免失误导致数据丢失。
- 部分小众图片格式(如WebP)可能不支持此EXIF属性,脚本会输出警告并跳过。
- 若照片原本没有
DateTimeOriginal属性,会抛出找不到属性的错误,可在catch块中添加创建新属性项的逻辑(需额外设置PropertyItem的Id、Type和Len字段)。
内容的提问来源于stack exchange,提问作者dedddoo230
相关产品推荐
相关产品推荐

