PowerShell でファイルのタイムスタンプを変更するコマンド|更新日時の一括変更も

  • URLをコピーしました!
目次

はじめに

システム運用やテストデータの作成では、ファイルの更新日時を過去の日付に戻したい、特定の日時に揃えたい、という場面があります。フリーソフトを使う方法もありますが、Windows 標準の PowerShell を使えば、追加インストール不要でファイルの日時を操作できます。

本記事では、単体ファイルの変更から、フォルダ内の大量ファイルを一括変更する方法まで、コピペで使えるコマンドを紹介します。あわせて、地域設定に依存しない日付の指定方法や、一括処理の前に行う安全策など、実務でつまずきやすい点も解説します。

この記事でわかること
  • 作成日時・更新日時・アクセス日時を変更する方法(地域設定に依存しない指定)
  • フォルダ内の全ファイルを一括で変更する方法(サブフォルダ含む)
  • 一括変更の前に元の日時を退避し、変更内容を事前確認する安全策
  • Linux の touch コマンドのように、現在時刻へ更新する方法

結論を先に述べると、ファイルの日時変更は Set-ItemProperty で行えます。このとき日付を "2025/01/01" のような文字列で渡すと地域設定によって解釈が変わるため、(Get-Date "2025-01-01 12:00:00") のように Get-Date を使う指定が安全です。Get-Item でファイルを取得してプロパティへ直接代入する書き方もあり、用途で使い分けられます。

基本: ファイルのタイムスタンプを変更する

Windows のファイルには、作成日時(CreationTime)、更新日時(LastWriteTime)、アクセス日時(LastAccessTime)の 3 つのタイムスタンプがあります。Explorer の「更新日時」列に表示されるのは LastWriteTime です。これらは Set-ItemProperty で変更できます。

日付は Get-Date で指定する(地域設定対策)

変更コマンドに入る前に、日付の指定方法を押さえます。日付を "2025/01/01 12:00:00" のような文字列で渡すと、文字列から日時への変換がシステムの地域設定に依存します。dd/MM/yyyy 形式の環境などでは、エラーになったり意図しない日付になったりすることがあります。

これを避けるため、本記事では Get-Date で日時を渡す形を基本とします。2025-01-01 のような並び(年-月-日)は、地域設定をまたいで予測可能に解釈されます。

# 推奨: Get-Date を使い、年-月-日で指定する
Set-ItemProperty "./test.txt" -Name LastWriteTime -Value (Get-Date "2025-01-01 12:00:00")

更新日時(LastWriteTime)を変更する

最も使う頻度が高いのが、更新日時の変更です。プロパティ名に LastWriteTime を指定します。

Set-ItemProperty "./test.txt" -Name LastWriteTime -Value (Get-Date "2025-01-01 12:00:00")

作成日時(CreationTime)を変更する

ファイルが作成された日を変更する場合は、プロパティ名に CreationTime を指定します。

Set-ItemProperty "./test.txt" -Name CreationTime -Value (Get-Date "2020-04-01 09:00:00")

アクセス日時(LastAccessTime)を変更する

最後に開いた日時を変更する場合は、プロパティ名に LastAccessTime を指定します。

Set-ItemProperty "./test.txt" -Name LastAccessTime -Value (Get-Date "2025-02-05 18:30:00")

なお、アクセス日時には現行の Windows ならではの注意点があります。詳細は後半の注意点で解説しますが、Windows 10 以降では既定でアクセス日時の自動更新が無効になっているため、表示される LastAccessTime が実際の最終アクセスを反映していないことがあります。

もう 1 つの書き方: Get-Item で直接代入する

Set-ItemProperty のほかに、Get-Item でファイルを取得し、タイムスタンプのプロパティへ直接代入する方法もあります。

# Get-Item でファイルを取得し、プロパティへ直接代入する
(Get-Item "./test.txt").LastWriteTime = (Get-Date "2025-01-01 12:00:00")

2 つの書き方は、用途で使い分けられます。直接代入は .NET オブジェクトを直接操作するため、大量のファイルを処理する際に高速です。一方の Set-ItemProperty は記述が読みやすく、後述する -WhatIf(変更内容の事前確認)や -Confirm に対応するという利点があります。本記事では、確認のしやすさから Set-ItemProperty を中心に進めます。

参考: How to Change File Properties Using PowerShell(SharePoint Diary)
“I prefer the Get-Date cmdlet because it handles date formats more predictably across different regional settings.”
(Get-Date は地域設定をまたいで日付形式をより予測可能に扱うため、推奨します。)
https://www.sharepointdiary.com/2023/10/how-to-change-file-properties-using-powershell.html

応用: フォルダ内のファイルを一括で変更する

1 つずつファイルを指定するのは手間がかかります。Get-ChildItem(ファイル一覧を取得するコマンド)とパイプライン | を組み合わせると、フォルダ内のファイルをまとめて処理できます。

ただし、一括変更は多数のファイルを一度に書き換えるため、元に戻せるよう準備してから実行することをおすすめします。先に安全策を示します。

安全策 1: 変更前に元の日時を退避する

一括変更の前に、対象ファイルの現在のタイムスタンプを CSV に書き出しておくと、問題があったときに元の値を確認・復元できます。

# 変更前に元のタイムスタンプを CSV へ退避する
Get-ChildItem -Path "C:\Data" -Recurse -File |
    Select-Object FullName, CreationTime, LastWriteTime, LastAccessTime |
    Export-Csv -Path "C:\Data\timestamps_backup.csv" -Encoding UTF8 -NoTypeInformation

安全策 2: -WhatIf で変更内容を事前確認する

Set-ItemProperty-WhatIf を付けると、実際には変更せず、何が変更されるかだけを表示できます。大量のファイルを処理する前に、対象が想定どおりかを確認できます。

# 実際には変更せず、対象を確認する
Get-ChildItem -Path "C:\Data" -File | ForEach-Object {
    Set-ItemProperty $_.FullName -Name LastWriteTime -Value (Get-Date "2025-12-31 23:59:59") -WhatIf
}

表示された対象に問題がなければ、-WhatIf を外して実行します。

フォルダ直下のファイルをすべて変更する

指定したフォルダの直下にあるファイルの日時を、まとめて変更します。

Get-ChildItem -Path "C:\Data" -File | ForEach-Object {
    Set-ItemProperty $_.FullName -Name LastWriteTime -Value (Get-Date "2025-12-31 23:59:59")
}

各コマンドの役割は次のとおりです。Get-ChildItem がファイルの一覧を取得し、パイプライン | が左側の結果を右側へ渡します。ForEach-Object が渡されたファイルを 1 つずつ処理し、$_ が現在処理しているファイルを表します。

サブフォルダも含めて再帰的に変更する

フォルダが階層構造になっている場合、-Recurse オプションを付けると、配下の全階層を探索して処理します。

Get-ChildItem -Path "C:\Data" -Recurse -File | ForEach-Object {
    Set-ItemProperty $_.FullName -Name LastWriteTime -Value (Get-Date "2025-12-31 23:59:59")
}

ここで -File を付けているのは、ファイルだけを対象にし、フォルダ自体のタイムスタンプを変更しないためです。フォルダの日時も変更したい場合は -File を外します。

Tips: 現在時刻(今)に変更する

Linux の touch コマンドのように、更新日時を「今」にしたい場合は、現在時刻を手入力する必要はありません。Get-Date を引数なしで使うと、システムの現在時刻が得られます。

# 更新日時を現在時刻にする
Set-ItemProperty "./test.txt" -Name LastWriteTime -Value (Get-Date)

(Get-Date) をかっこで囲むことで、先に Get-Date が実行され、その結果(現在時刻)が -Value に渡されます。バッチ処理で、処理が完了した時刻を記録する用途にも使えます。一括処理を定期的に実行したい場合は、関連記事『PowerShell をタスクスケジューラで定期実行する方法』とあわせて利用できます。

変更結果を確認する

日時が正しく変更されたかは、Explorer の「更新日時」列でも確認できますが、PowerShell 上で確認するほうが効率的です。Get-ItemProperty で取得し、Select-Object で表示したいプロパティを選びます。

Get-ItemProperty "./test.txt" | Select-Object Name, CreationTime, LastWriteTime, LastAccessTime

実行結果のイメージは次のとおりです。

Name       CreationTime          LastWriteTime          LastAccessTime
----       ------------          -------------          --------------
test.txt   2020/04/01 9:00:00    2025/12/31 23:59:59    2025/02/05 18:30:00

フォルダ内の複数ファイルをまとめて確認する場合は、Get-ChildItem と組み合わせます。

Get-ChildItem -Path "C:\Data" -File | Select-Object Name, CreationTime, LastWriteTime, LastAccessTime

注意点

タイムスタンプの変更には、把握しておきたい注意点があります。意図しない結果を避けるため、変更前に確認しておくことをおすすめします。

アクセス日時は既定で更新が無効

Windows 10 以降では、NTFS の性能向上のため、アクセス日時(LastAccessTime)の自動更新が既定で無効になっています。そのため、ファイルを開いても LastAccessTime が更新されず、表示される値が実際の最終アクセスを反映していないことがあります。アクセス日時を基準にした処理を行う場合は、この点に留意します。

書き込み権限が必要

タイムスタンプを変更するには、対象ファイルやフォルダへの書き込み権限が必要です。読み取り専用属性のファイルや、権限のない場所のファイルでは変更に失敗します。読み取り専用の場合は、属性を解除してから変更します。

# 読み取り専用属性を解除してから変更する
Set-ItemProperty "./test.txt" -Name IsReadOnly -Value $false
Set-ItemProperty "./test.txt" -Name LastWriteTime -Value (Get-Date "2025-01-01 12:00:00")

再保存すると更新日時が上書きされる

更新日時(LastWriteTime)を変更した後にファイルを開いて保存すると、Windows がその保存時刻で LastWriteTime を上書きします。表示や整理のために日時を変更する場合は、ファイルの編集を終えた後、共有・保管の直前に変更するのが安全です。

フォルダのタイムスタンプも変更できる

本記事ではファイルを中心に扱いましたが、フォルダのタイムスタンプも同じ方法で変更できます。Get-Item でフォルダを指定して変更します。

# フォルダの更新日時を変更する
Set-ItemProperty "C:\Data" -Name LastWriteTime -Value (Get-Date "2025-01-01 12:00:00")

まとめ

本記事では、PowerShell でファイルのタイムスタンプ(作成・更新・アクセス日時)を変更する方法を解説しました。地域設定に依存しない日付指定や、一括変更の安全策、つまずきやすい注意点もあわせて整理しました。

  • 日時の変更は Set-ItemProperty で行える
  • 日付は Get-Date と年-月-日の並びで指定すると安全
  • Get-Item での直接代入は大量処理で高速
  • 一括変更は Get-ChildItem と -Recurse で再帰処理
  • 変更前に Export-Csv で退避し -WhatIf で確認すると安全
  • アクセス日時は既定で更新が無効な点に留意
  • 変更には書き込み権限が必要で再保存で上書きされる

最後に、よく使う構文をまとめます。コピペ用としてご活用ください。

# 更新日時を変更する
Set-ItemProperty "ファイルパス" -Name LastWriteTime -Value (Get-Date "2025-01-01 12:00:00")

# 作成日時を変更する
Set-ItemProperty "ファイルパス" -Name CreationTime -Value (Get-Date "2025-01-01 12:00:00")

# 現在時刻に変更する
Set-ItemProperty "ファイルパス" -Name LastWriteTime -Value (Get-Date)

# フォルダ内の全ファイル(サブフォルダ含む)を一括変更する
Get-ChildItem -Path "フォルダパス" -Recurse -File | ForEach-Object {
    Set-ItemProperty $_.FullName -Name LastWriteTime -Value (Get-Date "2025-01-01 12:00:00")
}

以上、最後までお読みいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

関西を拠点に活動する、現役インフラエンジニア。経験20年超。

大手通信キャリアにて、中〜大規模インフラ(ネットワーク・サーバ・クラウド・セキュリティ)の設計・構築およびプロジェクトマネジメントに従事。現場で直面した技術課題への対処や、最新の脆弱性情報への実務対応を、一次情報として発信しています。

保有資格
CCIE Lifetime Emeritus(取得から20年以上)/ VCAP-DCA / Azure Solutions Architect Expert

▶ 運営者プロフィール(詳細)

目次