我正在尝试使用 powershell 修复照片的元数据。 我需要将 exif DateTaken 设置为文件 CreationTime
这是我的代码:
[reflection.assembly]::loadfile( "C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll")
echo "--------"
echo ""
$files = Get-ChildItem E:\Photos\*.*
ForEach ($file in $files) {
#Get Date
$foo=New-Object -TypeName system.drawing.bitmap -ArgumentList $file.fullname
$date = $foo.GetPropertyItem(36867).value[0..9]
$arYear = [Char]$date[0],[Char]$date[1],[Char]$date[2],[Char]$date[3]
$arMonth = [Char]$date[5],[Char]$date[6]
$arDay = [Char]$date[8],[Char]$date[9]
$strYear = [String]::Join('',$arYear)
$strMonth = [String]::Join('',$arMonth)
$strDay = [String]::Join('',$arDay)
$DateTaken = $strDay + "/" + $strMonth + "/" + $strYear
# Get Time
$time = $foo.GetPropertyItem(36867).value[11..18]
$arHour = [Char]$time[0],[Char]$time[1]
$arMinute = [Char]$time[3],[Char]$time[4]
$arSecond = [Char]$time[6],[Char]$time[7]
$strHour = [String]::Join('',$arHour)
$strMinute = [String]::Join('',$arMinute)
$strSecond = [String]::Join('',$arSecond)
$TimeTaken = $strHour + ":" + $strMinute + ":" + $strSecond
# Link into one date and time
$FullDate = $DateTaken + " " + $TimeTaken
echo "File name"
echo $file.name
echo ""
echo "Wrong data"
echo (Get-Item $file).creationtime.datetime
echo ""
echo "Right data"
echo $FullDate
echo ""
#Set DateTaken as CreationTime
(Get-Item $file).creationtime= $FullDate
pause
}
我收到错误“无法访问该文件,因为它正在被另一个进程使用”。 我不知道如何解决它。
PS。我不确定$FullDate
是否具有正确的语法,因为我无法测试它
谢谢
最佳答案
感谢@TomG,解决了我的问题 我已经完成了这个项目。我发布代码,这可能有助于将来修复照片中的日期的人
[reflection.assembly]::loadfile( "C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll")
Clear-Host
$files = Get-ChildItem E:\Photos\*.*
$i = 1
ForEach ($file in $files) {
# Print file name
echo $file.fullname
# Print Number of File
# Write-Host 'File no: ' $i
# echo ""
#Get Date
$foo=New-Object -TypeName system.drawing.bitmap -ArgumentList $file.fullname
$date = $foo.GetPropertyItem(36867).value[0..9]
$arYear = [Char]$date[0],[Char]$date[1],[Char]$date[2],[Char]$date[3]
$arMonth = [Char]$date[5],[Char]$date[6]
$arDay = [Char]$date[8],[Char]$date[9]
$strYear = [String]::Join('',$arYear)
$strMonth = [String]::Join('',$arMonth)
$strDay = [String]::Join('',$arDay)
# Date to string
# $DateTaken = $strDay + "/" + $strMonth + "/" + $strYear
# Get Time
$time = $foo.GetPropertyItem(36867).value[11..18]
$arHour = [Char]$time[0],[Char]$time[1]
$arMinute = [Char]$time[3],[Char]$time[4]
$arSecond = [Char]$time[6],[Char]$time[7]
$strHour = [String]::Join('',$arHour)
$strMinute = [String]::Join('',$arMinute)
$strSecond = [String]::Join('',$arSecond)
$foo.dispose()
# Time to string
# $TimeTaken = $strHour + ":" + $strMinute + ":" + $strSecond
$NewDate = (Get-Date -Year $strYear -Month $strMonth -Day $strDay -Hour $strHour -Minute $strMinute -Second $strSecond)
#Set DateTaken as CreationTime
(Get-Item $file).CreationTime = $NewDate
(Get-Item $file).LastWriteTime = $NewDate
$i++
# Clear-Host
}
echo ""
echo "Done"
pause
关于powershell - 将 EXIF DateTaken 设置为文件创建时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47685407/