【Power Shell】ファイルのタイムスタンプを一括で変更する

ネコニウム研究所

PCを利用したモノづくりに関連する情報を掲載するブログ

【Power Shell】ファイルのタイムスタンプを一括で変更する

2021-12-7 | ,

Power Shell と Batch(補助)でファイルのタイムスタンプを一括で変更するよ!

プライバシーって重要だよね!!

環境

  • Windows 10 Home Version 21H1(OS ビルド 19043.1348)
  • Power Shell 5.1.19041.1320

仕様書

  • bat ファイルに処理したいファイル・フォルダをドラッグ・アンド・ドロップするとファイルのタイムスタンプ(作成日時、更新日時、アクセス日時)を変更する。
    • ファイルの場合は、実行日(今日)の 00:00:00 にタイムスタンプを変更する。
    • フォルダの場合は、フォルダ名を 2021-12-6 等の日付にしておくことで中にあるファイルをフォルダ名で指定した日付の 00:00:00 にタイムスタンプを変更する。
    • フォルダ名が日付に変換できない場合は、ファイルの場合と同様にタイムスタンプを実行日に変更する。
  • 処理が完了したら、処理したファイル数を出力する。

手順書

batch ファイル作成

change-timestamp.bat を作成して、下記を入力する。

@echo off
cd %~dp0
powershell -ExecutionPolicy RemoteSigned -File "./change-timestamp.ps1" %*
exit

ps1 ファイル作成

change-timestamp.bat と同じ場所に change-timestamp.ps1 を作成して、下記を入力する。

[datetime]$today = Get-Date -DisplayHint Date '00:00:00';
[int]$cnt = 1;

foreach ($arg in $args) {
    If ((Get-Item $arg).PSIsContainer) {
        $dirname = Split-Path $arg -Leaf;
        $dt = $dirname + ' 00:00:00';
        try {
            $ts = Get-Date -DisplayHint Date $dt;
        }
        catch {
            $ts = $today;
        }
        Set-Location $arg;
        Get-ChildItem $arg -Recurse -File | ForEach-Object {
            Write-Output ("[" + $cnt + "] " + $arg + '\' + $_.Name);
            Set-ItemProperty $_ -Name LastWriteTime -Value $ts;
            Set-ItemProperty $_ -Name LastAccessTime -Value $ts;
            Set-ItemProperty $_ -Name CreationTime -Value $ts;
            $cnt++;
        }
    }
    else {
        Write-Output ("[" + $cnt + "] " + $arg);
        $ts = $today;
        Set-ItemProperty $arg -Name LastWriteTime -Value $ts;
        Set-ItemProperty $arg -Name LastAccessTime -Value $ts;
        Set-ItemProperty $arg -Name CreationTime -Value $ts;
        $cnt++;
    }
}

Read-Host ("Press enter (Processed " + ($cnt - 1) + " files)");

テスト

ドラッグ・アンド・ドロップしたファイルのプロパティを表示して、作成日時、更新日時が変更されてるか確認する。[1]

[1] アクセス日時は、プロバティを表示した時点でその日時が入力されてしまうので確認が難しい。

まとめ

ブログの画像素材とかに使えば良いと思うよ!