【Power Shell】ファイルのタイムスタンプの時刻を一括でクリアする

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【Power Shell】ファイルのタイムスタンプの時刻を一括でクリアする

2021-12-20 |

Power Shell と Batch(補助)でファイルのタイムスタンプの時刻を一括で 00:00:00 にクリアしたい!

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

今回は、日付はそのままでいいけど、時刻だけは 00:00:00 にしたよー!って人向けです。

「こいつ、深夜に作業してるか!けしからん!!」を防止することができます。何がけしからんのかよくわからないですが…。

環境

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

仕様書

  • bat ファイルに処理したいファイル・フォルダをドラッグ・アンド・ドロップするとファイルのタイムスタンプ(作成日時、更新日時、アクセス日時)の時刻を 00:00:00 に変更する。
  • 処理が完了したら、処理したファイル数を出力する。

手順書

batch ファイル作成

clear-time.bat を作成して、下記を入力する。
これは前回とファイル名以外は同じです。

@echo off
cd %~dp0
powershell -ExecutionPolicy RemoteSigned -File "./`clear-time.ps1" %*
exit

ps1 ファイル作成

clear-time.bat と同じ場所に clear-time.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)");

テスト

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

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

まとめ

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