* Powershellでデジカメ・スマートフォンの写真の撮影日時を取得し,後方参照で文字列置換

:CATEGORIES: Powershell


(Get-ChildItem -Recurse | ? { ! $_.PSIsContainer } | Measure-Object).Count

$file_path = "C:\Users\(ファイルの絶対パス)\2002-12-29_163215_告発事件一件記録(写真資料・撮影日時).jpg"

[Reflection.Assembly]::LoadWithPartialName("System.Drawing") | Out-Null
$img = $null
$img = New-Object Drawing.Bitmap($file_path)

$date = ($img.PropertyItems | Where-Object{$_.Id -eq 306}).value
$date = [Text.Encoding]::ASCII.GetString($date)
$date = $date -replace "(....):(..):(..) (..):(..):(..)", '$1-$2-$3_$4$5$6'

PS D:\> echo $date
2002-12-29_163215

参考:
デジカメ、スマートフォンなどで撮影した画像、動画ファイルをリネーム後月ごとのフォルダに移動するスクリプト · GitHub https://gist.github.com/ebibibi/4175880?fbclid=IwAR3q7utypxoxlekjeQBTI-CMgWhg555FXrMPV7pvPDLIYkkLzgfQL6knUqY
後方参照はシングルクォートで - コンピュータってすごいらしい https://kyasmt.hatenablog.com/entry/20091215/1260863095

 「$date.Replace('0', 'x').Replace('2', 'y').Replace('1', 'z')」という形式での正規表現,後方参照はできないみたいです。少し調べたところ,次のページによると,-replaceは,オプション指定ではなく演算子のようです。

PowerShell - 正規表現 | powershell Tutorial https://sodocumentation.net/ja/powershell/topic/6674/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE

 「 [regex]::Replace($date, "(....):(..):(..) (..):(..):(..)", '$1-$2-$3_$4$5$6')」というやり方もできました。こちらの方が他のプログラム言語に近い書式で,可読性が良さそうに思います。