Windows PowerShellのGet-ItemとRemove-Itemコマンドレットでタイムスタンプが2日以上前のファイルとフォルダを削除する
今回はその応用で、その表示されたデータを削除します。
古いログファイルなどを削除する事を想定しています。
コマンドプロンプトからPowerShellスクリプトを呼び出します。
引数の「2」は、直近の2日分を残す(今日と昨日の分を残す)事を意味します。
C:\>powershell.exe C:\Batch\フォルダとファイルの削除.ps1 2
コマンドプロンプトから呼び出されるPowerShellスクリプトです。
前回の削除対象を表示するスクリプトの最後に、パイプと「Remove-Item -Recurse」を追加しただけです。
繰り返しになりますが、このコマンドではC:\Tempフォルダ直下のフォルダの更新日時を見て削除対象かどうかを判断します。Param($保存日数)
Get-ChildItem -path C:\Temp | Where-object{((Get-Date) - $_.LastWriteTime).Days -ge $保存日数 } | Remove-Item -Recurse
インターネットで同様のコマンドを検索すると、フォルダ内の全ファイルのタイムスタンプを再帰的に取得して、個々のファイルのタイムスタンプで削除対象かどうかを判断している事例ばかりでした。
今回は、あるフォルダの中に入っている複数のファイルは、それを格納するフォルダのタイムスタンプだけを見て削除対象がどうかを判断できる状況を想定しています。
これだとファイルだけが削除されて、空のフォルダが残るような事もなく、簡単です。
では削除スクリプトを実行してみます。
(画像1)C:\Tempのフォルダとファイルの一覧
C:\Windows\system32\cmd.exe |
C:\>powershell.exe Get-ChildItem -path C:\Temp ディレクトリ: C:\Temp Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2016/12/10 4:00 001 d---- 2016/12/11 4:00 002 d---- 2016/12/12 4:00 003 d---- 2016/12/13 4:00 004 -a--- 2016/12/10 4:00 0 001.txt -a--- 2016/12/11 4:00 0 002.txt -a--- 2016/12/12 4:00 0 003.txt -a--- 2016/12/13 4:00 0 004.txt C:\> _ |
(画像2)現在の日時
C:\Windows\system32\cmd.exe |
C:\>powershell.exe Get-Date 2016年12月13日 8:53:56 C:\> _ |
(画像3)削除スクリプトを実行
C:\Windows\system32\cmd.exe |
C:\>powershell.exe C:\Batch\フォルダとファイルの削除.ps1 2 C:\> _ |
(画像4)削除スクリプトを実行後のC:\Tempフォルダ
C:\Windows\system32\cmd.exe |
C:\>powershell.exe Get-ChildItem -path C:\Temp ディレクトリ: C:\Temp Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2016/12/12 4:00 003 d---- 2016/12/13 4:00 004 -a--- 2016/12/12 4:00 0 003.txt -a--- 2016/12/13 4:00 0 004.txt C:\> _ |
(画像5)削除スクリプトを実行後のC:\Tempフォルダ

直近の2日分(今日と昨日の分)を残し、それよりも古いデータが削除されました。
属性の「LastWriteTime」はファイルやフォルダの更新日時です。
これを「CreationTime」にすれば、作成日時になります。
(画像6)C:\Temp\001フォルダ内の存在していた更新日時が新しいファイル

前回の記事にも書きましたが、C:\Tempの下の001、002、003、004の各フォルダの下にはタイムスタンプ(更新日時)が2016/12/13 07:00過ぎのファイルを1つずつ置いています。
これはもちろん、現時点から「2日以上古い」には該当しません。
しかしあくまでもC:\Tempの下の001、002、003、004の各フォルダの更新日時だけを見てフォルダ事ごと削除するので、C:\Temp\001とC:\Temp\002フォルダは、その中に含まれるファイルも含めてすべて削除されています。
(想定した動作です)