PowerShellで日時が入ったファイル名から年月日を取り出すには

ドライブレコーダーで録画したビデオファイルですが。

ファイル名に日時が入っています。このような感じで。

このファイル名から、日付を取り出すにはどうすればよいでしょう?

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演算子を使用すると、ファイル名から簡単に日時を取り出せることがわかりました。

次回は、取り出した日時を使って、ファイルを日付ごとのフォルダに移動して整頓できるようにしたいと思います。

それではまた。ごきげんよう。

スポンサーリンク

フォローする

スポンサーリンク