PowerShell
jpeg

Powershell 指定したフォルダのすべてのJpegファイルの作成日時、更新日時、最終アクセス日時を撮影日時にする

More than 1 year has passed since last update.

スクリプト

GetPhotoTakenAndSetTimeStampLoop.ps1
#Set-ExecutionPolicy RemoteSigned -Scope Process -Force
$vbCrLf = "`n"
[void][System.Reflection.Assembly]::Load("Microsoft.VisualBasic, Version=8.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a")

$provider = New-Object Microsoft.VisualBasic.VBCodeProvider
$params = New-Object System.CodeDom.Compiler.CompilerParameters
$refs = `
"System.dll","Microsoft.VisualBasic.dll","System.Data.DLL", `
"System.management.dll","System.DirectoryServices.dll"
$params.ReferencedAssemblies.AddRange($refs)
$input = [Microsoft.VisualBasic.Interaction]::InputBox("変換したいファイルのあるフォルダ名を入寮してください。例 C:\hoge\", "Visual Basic関数")
if( -not (test-path $input)){Break} #フォルダがなければ終了する
$files = Get-ChildItem $input -recurse -include *.jpg, *.Jpeg, *.JPEG, *.JPG #拡張子をJpegに指定、-recurseでサブフォルダまでファイルを列挙するよう指定
foreach($objfile in $files){
[string]$sFileName = $objfile.FullName
#GetTakenData($objfile)
Get-ExifData($sFileName)
Function Get-ExifData([string]$sFileName)
{
[Reflection.Assembly]::LoadFile('C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Drawing.dll') | Out-Null
# [Reflection.Assembly]::LoadFile('C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll') | Out-Null
$image = New-Object System.Drawing.Bitmap -ArgumentList $sFileName
try {
$DTCT=(Get-ItemProperty $sFileName).CreationTime
$DTMD=(Get-ItemProperty $sFileName).LastWriteTime
$DTAC=(Get-ItemProperty $sFileName).LastAccessTime
$takenData = GetTakenData($image)
if ($takenData -eq $null) {
return $null
}
$takenValue = [System.Text.Encoding]::Default.GetString($takenData, 0, $takenData.Length - 1)
$taken = [DateTime]::ParseExact($takenValue, 'yyyy:MM:dd HH:mm:ss', $null).ToString("yyyy/MM/dd HH:mm:ss",[System.Globalization.CultureInfo]::InvariantCulture)

return $taken
}
finally {
$image.Dispose()
(get-ItemProperty $sFileName).set_Creationtime($taken) #作成日時
(get-ItemProperty $sFileName).set_LastWritetime($taken) #更新日時
(get-ItemProperty $sFileName).set_lastaccessTime($taken) #最終アクセス日時
}
}

}

function GetTakenData([object]$image) {
try {
return $image.GetPropertyItem(36867).Value
}
catch {
return $null
}
}

使用方法

すべてのプログラム> W の項目から、Windows Powershell >PowershellISEを起動し、コピペする(32/64どちらでもよい)
このスクリプトをGetPhotoTakenAndSetTimeStampLoop.ps1として保存する。
Set-Exe...をいれる(そのために1行目に用意)
ファイルの拡張子はJpeg形式、そしてサブフォルダまで検索して列挙するようになっている。 -recurseオプションの部分。

作成日時、更新日時のうち変えたくないものは削除するか行頭にナンバー記号 # をつけて注釈にして無効化するとよい。

注意

撮影日時の取得は簡単な方法によっているのでWindowsがバージョンアップすると変わるかもしれない。