昔、某地検のバカがやってたやつだ。あれはFDのファイルに対してのちんけな改竄だが、今回のはターゲットが1千超なんだ。昨年末から DV のデータを DVD に落としていて、ついでに HDD に .avi ファイルとして保存してきたわけだが、Windows Live ムービーメーカーを使い、SONY DCR-TRV200 で再生し、IEEE1394a 経由でキャプチャすると、タイムスタンプが9時間進んでいるんだ。どこかで誰かが装置時間を UTC とみなし、JST への変換 +9 時間を行っているらしい。犯人は、Microsoft である公算が大きいが・・・。Windows Live ムービーメーカーはキャプチャしたデータのファイル名、作成日時、更新日時を変換後の時間を使って生成するという悩ましい仕様である。ビデオカメラの機器時間をUTCで設定し、JST時差設定をして運用すべきなんだろうけど、それはあくまで正論(机上の空論)であって、現実にそんな設定をしている人は皆無であろう。
当初、コマンドプロンプトで処理しようと思ったが、ファイル名のリネームはできても作成日時や更新日時は変更できない。あ、更新日時は変えられるか。しゃあない PowerShell の出番である。
スタート/すべてのプログラム/アクセサリ/Windows PowerShell/Windows PowerShell(x86) を右クリック。管理者として実行。PowerShell のウインドウが上がったら、Set-ExecutionPolicy RemoteSigned と入れて、スクリプトの実行を許可する。あとは、目的のディレクトリに移り、スクリプトを用意して、./AdjustFilename 、./SetTime とするだけ。今回は、1092のファイルに対し処理を行う。めでたしめでたし。
恐るべしオブジェクト指向シェル。
今回は、ファイルネームに注目して、そこから時間を生成して9時間引いたものでリネーム。次に同様にタイムスタンプを修正した。PowerShell を使うのが初めてだったのでおそるおそる段階的に処理したが、作成日時に注目してタイムスタンプとファイル名を一気に修正する方がエレガントだろう。コマンドももっとシンプルな使い方があることはいうまでもない。と、いうことでスクリプトは画像で掲載します。というか、 MathJax の祟りでテキストの引用がぐそぐそになっちゃっただけ。なんとかせねば。
ん?やればできるじゃん。
PowerShell AdjustFilename.ps1
\[
#
# AdjustFilename.ps1
#
# カレントディレクトリ以下にある .avi ファイルの、
# ファイルネームに記述された時間を、9時間遅らせてリネームする。
#
# 2014/03/26 Written by H.Nitobe
#
$List = Get-ChildItem . -Include *.avi -Recurse -Name
foreach ($i in $List)
{
$Directory, $Filename = $i.Split("\")
$Time = [DateTime]$Filename.Replace(".avi","").Replace("-","/").Replace(".",":")
$Time = $Time.AddHours(-9)
$NewFilename = Get-Date $Time -Format "yyyy-MM-dd HH.mm.ss"
$NewFilename = "$NewFilename.avi"
Rename-Item $i -newName $NewFilename
}
\]
PowerShell SetTime.ps1
\[
#
# SetTime.ps1
#
# カレントディレクトリ以下にある.avi ファイルの、
# 作成日時と更新日時をファイル名に記述された時間に合わせる。
#
# 2014/03/26 Written by H.Nitobe
#
$List = Get-ChildItem . -Include *.avi -Recurse -Name
foreach ($i in $List)
{
$Directory, $Filename = $i.Split("\")
$Time = [DateTime]$Filename.Replace(".avi","").Replace("-","/").Replace(".",":")
Set-ItemProperty -Name CreationTime $i -Value $Time
Set-ItemProperty -Name LastWriteTime $i -Value $Time
}
\]
Comments