ドライブレコーダーで録画したビデオファイルですが。
ファイル名に日時が入っています。このような感じで。
このファイル名から、日付を取り出すにはどうすればよいでしょう?
PowerShellを使用すると、このような感じで。
ファイル名から日付や時刻を取り出すことが可能です。
方法を記録しておこうと思います。
目次
PowerShellでファイル名から日時を取り出す手順
ずばり。このような内容になります。
Push-Location C:\Users\hide\Desktop\日付のファイル名
$files = Get-ChildItem -File
foreach($file in $files) {
if($file.Name -Match '^(?<year>\d{4})_(?<month>\d{2})(?<day>\d{2})_(?<hour>\d{2})(?<minute>\d{2})(?<sec>\d{2})' -eq $true) {
$file.Name
$Matches.year + '年'
$Matches.month + '月'
$Matches.day + '日'
}
}
Pop-Location
Push-LocationとPop-Locationは、ディレクトリを移動しつつ、後でもとのディレクトリに戻るコマンドになります。
日付のファイル名が入ったディレクトリに移動するコマンドレットです。
Push-Locationではなく、普通にSet-Locationで移動でも問題ありません。
ちなみに、DOS時代は、cdコマンドと、pushd, popdコマンドが相当しました。(PowerShellでもエイリアスがあるためcd, pushd, popdが使用可能
では、それ以外のコマンドレットを見てみようと思います。
Get-ChildItemとforeachでファイルを取得
ファイルの一覧は、Get-ChildItem -Fileコマンドレットで行います。
$files変数に入れたあと、foreachコマンドレットで個々のファイルを$fileに入れています。foreachは、ForEach-Objectコマンドレットのエイリアスのようです。
日時の取り出しは-Match演算子
ファイル名から日時を取り出す方法は、-Match演算子を使用してみました。
今回、ファイル名は次のような形式です。
2021_1125_073458_026B.MP4
これをパターンに直しますと。
(年4桁)_(月2桁)(日2桁)_(時2桁)(分2桁)(秒2桁)_(連番3桁)(カメラID1桁).(拡張子)
ここから、日時を取り出す正規表現のパターンは。
(\d{4})_(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})
そしてあとから「年」「日」のような変数名で取り出せるように、各グループに変数名を付けます。
(?<year>\d{4})_(?<month>\d{2})(?<day>\d{2})_(?<hour>\d{2})(?<minute>\d{2})(?<sec>\d{2})
これが今回、ファイル名から日時を取り出すパターンになります。
ちなみに前述のスクリプトでは、先頭に「^」を付けました。^は1行の開始位置を示す正規表現になります。これは、ファイル名の先頭が年のファイルのみ対象にする意味になります。パターンにマッチングしない、対象外のファイルは無視されます。
$Matches変数から日時を取り出す
先ほど、パターンの各グループに変数名を付けたため。
-Matchにてパターンマッチングを行った結果は、次の変数名で取り出すことが可能です。
$Matches.year
$Matches.month
$Matches.day
$Matches.hour
$Matches.minute
$Matches.sec
ファイル名から日付を取り出す汎用的な関数
やっている内容は同じですが。
ファイル名を受け取って、日付を取り出した結果をハッシュテーブルで返す関数にしてみました。
class DenorFileUtility {
static [Array] GetDateByFileName([string]$filename) {
if($filename -Match '^(?<year>\d{4})_(?<month>\d{2})(?<day>\d{2})_(?<hour>\d{2})(?<minute>\d{2})(?<sec>\d{2})' -ne $true) {
return $null
}
return @{
Year = $Matches.year
Month = $Matches.Month
Day = $Matches.day
Hour = $Matches.hour
Minute = $Matches.minute
Sec = $Matches.sec
}
}
}
Push-Location C:\Users\hide\Desktop\日付のファイル名
$files = Get-ChildItem -File
foreach($file in $files) {
$filedate = [DenorFileUtility]::GetDateByFileName($file.Name)
if($filedate -eq $null) { continue }
$file.Name
$filedate.Year + '年'
$filedate.Month + '月'
$filedate.Day + '日'
}
Pop-Location
Remove-Variable $files
クラスで実装しているのは、そのうちモジュールにして、汎用的に使用するための準備になります。
このような感じで。
PowerShellのGet-ChildItemコマンドレットと-Match演算子を使用すると、ファイル名から簡単に日時を取り出せることがわかりました。
次回は、取り出した日時を使って、ファイルを日付ごとのフォルダに移動して整頓できるようにしたいと思います。
それではまた。ごきげんよう。