Windowsでファイルの作成日や更新日を変更する方法
Windowsのファイルの日付は、エクスプローラからプロパティを開けば、作成日・更新日・アクセス日が時分秒で確認できる。変更するにはテクニックが要る。
PowerShellを起動
ファイル日付を変更するには、コマンドプロンプトだけではできない。WindowsのPowerShellを使う必要がある。PowerShellというのは、Windows 10/11に標準装備されていて通常はインストールする必要はない。
コマンドプロンプトからPowerShellと打ち込むと起動する。
起動したら、変更対象のフォルダへ移動。通常のMS-DOS系のコマンドはもちろん使える。MS-DOS系のdirの代わりにUNIX系のlsも使える。
ファイル時刻の変更
作成日時の変更は次の通り。Set-ItemPropertyというコマンドを使う。target_filenameの所に変更対象のファイル名を入れる。ワイルドカードとして*が使える。コマンド名は読みやすく書いているだけで、全部小文字でも構わない。ブラウザの表示では改行されているかもしれないが、改行せずに1行で書く。
Set-ItemProperty target_filename -name CreationTime -value ‘2025/01/01 12:00:00’
更新日時は次の通り。
Set-ItemProperty target_filename -name LastWriteTime -value ‘2025/01/01 12:00:00’
ファイル時刻の一覧表示
冒頭に書いたようにファイル時刻の表示は簡単にできるのだが、一覧で表示したい時には、次のコマンドを使う。
Get-ItemProperty target_filename | Select-Object -Property CreationTime, LastWriteTime, Name
例えば、test1.txt, test2.txt, test3.txtの3つのファイルがあるフォルダで、次のコマンドを実行すると以下のように出力できる。
Get-ItemProperty * | Select-Object -Property Name,CreationTime,LastWriteTime
CreationTime LastWriteTime Name
———— ————- —-
2025/05/01 12:40:57 2025/05/12 16:08:00 test1.txt
2025/05/01 12:41:09 2025/05/13 17:50:00 test2.txt
2025/05/01 12:54:57 2025/05/14 20:54:58 test3.txt
表示では、CreationTime, LastWriteTime, Name以外にも、次の項目を表示できる。変更はできない。
LastAccessTime:最後にアクセスした日時
Length:ファイルサイズ
アクセス日時の変更
最後のアクセス日時の変更は通常はできないのだが、制限を解除する方法がある。fsutilというコマンドを使う。fsutilでアクセス日時の変更を有効/無効の設定ができる。
管理者権限でコマンドプロンプトを開く。
現在の状態を確認する。必要に応じて後で戻せるようにするためだ。
C:\> fsutil behavior query DisablelLastAccess
DisableLastAccess = 2 (システム管理、無効)
次のコマンドで設定変更する。
C:\> fsutil behavior set DisableLastAccess 3
DisableLastAccess = 3 (システム管理、有効)
この変更でエラーが無ければ、次のようにアクセス日時の変更ができる。
Set-ItemProperty target_filename -Name LastAccessTime -Value “2025/05/05 12:34:56”
設定を戻したい場合は、設定変更の前にqueryで表示されたコードを指定する。この場合は初期値が2だったので次のようにコマンドを入れた。
C:\> fsutil behavior set DisablelLastAccess 2
DisableLastAccess = 2 (システム管理、無効)
更新日時に作成日時をセットする方法
次の例は、target1.txtとtarget2.txtそれぞれにファイル名を入れて実行すると、ファイルtarget1.txtの更新日時にファイルtarget2.txtの作成日時をセットする。
target1とtarget2は、異なるファイルでも同じファイルでも良い。CreationTime、LastWriteTime、LastAccessTimeをそれぞれ必要な場所に指定できる。
Set-ItemProperty target1.txt -name LastWriteTime -value ((Get-ItemProperty target2.txt).CreationTime)
一括でファイルの日時を変更する
一律に同じ日時を設定する方法
複数のファイルに一律に同じ時刻を設定するのは、先ほどのコマンドの単純な応用で実行できる。
ファイル名を指定するところにワイルドカードを使って、複数ファイルを指定すれば良い。例えばフォルダに、test1.txt、test2.txt、test3.txtの3ファイルがあるならば、3ファイルとも指定した日時がセットされる。
Set-ItemProperty test*.txt -name LastWriteTime -value ‘2025/01/01 12:00:00’
また、固定値ではなく他のファイルから情報を持ってくる場合も次のように複数ファイルを同時に更新できる。
Set-ItemProperty test*.txt -name LastWriteTime -value ((Get-ItemProperty target.txt).CreationTime)
ただし、target.txtの所は、ワイルドカードは使えない、多対多(many-to-many)ではあいまいでセットできない。
複数ファイルそれぞれ個々に更新日時に作成日時を設定する
これは少し複雑である。長いけれどもコピペして変更して使ってください。
フォルダのファイルを全て見に行って、それぞれのファイルの作成日時を読み込んで更新日時にセットする。
つまり、こういうこと。
・test1.txt の作成日時 → test1.txt の更新日時にセット
・test2.txt の作成日時 → test2.txt の更新日時にセット
・test3.txt の作成日時 → test3.txt の更新日時にセット
Get-ChildItem -Path *.txt | Where-Object { $_ -is [System.IO.FileInfo] } | ForEach-Object { Set-ItemProperty $_.FullName -Name LastWriteTime -Value ( $_.CreationTime.ToString(“yyyy/MM/dd HH:mm:ss”)) }
年月日時刻を特定のフォーマットに変換しているので、MMとかmmとかは意味があって、大文字と小文字を指定しているので、yyyyをYYYYに変更すると動かなくなるので注意が必要だ。
-Pathを指定することでファイル名を限定できるようにして、Where-Objectではファイルを対象に(フォルダを対象外に)している。それらを受けて、ForEact-Objectで繰り返し処理を行う。
さて、次の部分が重要で、ここを変更するといろいろな変化を付けることもできる。
($_.CreationTime.ToString(“yyyy/MM/dd HH:mm:ss”))
これはCreationTimeをそのまま持って来ている。時刻だけ特定して設定したい時は、この部分を次のように変更する。
($_.LastWriteTime.ToString(“yyyy/MM/dd” + ” ” + “12:34:56” )
↑これは元の更新日を活かして、時刻を12時34分56秒としている。
(“2025/01/23″ + ” ” + $_.LastWriteTime.ToString(“HH:mm:ss”))
↑これは2025年1月23日として、時刻は元の時刻をセットしている。
2025/01/01 12:00:00
途中の月日を変えたり、活かしたりといろいろな形にできるが、いずれにしても年月日時分秒が上記のフォーマットになるように加工する。年月日の間には空白が必要となる。
Powershellはかなり奥が深いが、分かり難い
もっといろいろなことが出来るようだ。また役立ちそうなことが見つかったらアップします。