LoginSignup
1
0

More than 5 years have passed since last update.

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

Posted at

スクリプト

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がバージョンアップすると変わるかもしれない。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0