当初、コマンドプロンプトで処理しようと思ったが、ファイル名のリネームはできても作成日時や更新日時は変更できない。あ、更新日時は変えられるか。しゃあない 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