アプリケーションやシステムが自動で生成するログファイル(拡張子「.log」)。これらは問題発生時には役立ちますが、放置しておくとどんどん溜まっていき、ディスクスペースを圧迫する原因になります。
今回は、AutoIt を使って指定した日数より古いログファイルを一括で検索し、自動で削除するお掃除スクリプトを紹介します。
これをタスクスケジューラに登録しておけば、定期的に PC をクリーンな状態に保つことができます。
スクリプトの概要
このスクリプトは、指定されたフォルダー内を再帰的に(サブフォルダーの奥深くまで)検索し、「.log」という拡張子を持つファイルを見つけます。
そして、そのファイルの最終更新日時をチェックし、設定した日数(例:30日)より古い場合、ファイルを自動的に削除します。
サンプルコード
#include <File.au3>
#include <Date.au3>
#include <MsgBoxConstants.au3>
; ### 設定項目 ###
; 検索を開始するフォルダーを指定します。
Local $sTargetFolder = @WindowsDir & "\Temp" ; 例としてWindowsのTempフォルダーを指定
; ここで指定した日数より古いファイルを削除します。
Local $iDaysOld = 30
; 削除対象のファイルの拡張子を指定します。
Local $sFileExtension = ".log"
; ### メイン処理 ###
; 削除したファイル数をカウントするための変数を初期化します。
Local $iDeletedCount = 0
; 指定されたフォルダー内にある、対象拡張子のファイルリストを再帰的に取得します。
Local $aFileList = _FileListToArrayRec($sTargetFolder, "*" & $sFileExtension, $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT)
; ファイルが見つからなかった場合のエラー処理です。
If @error Then
MsgBox($MB_ICONINFORMATION, "情報", "対象のファイルは見つかりませんでした。")
Exit
EndIf
; Forループを使って、見つかったファイルを一つずつチェックします。
For $i = 1 To $aFileList[0]
; ファイルのフルパスを取得します。
Local $sFilePath = $aFileList[$i]
; ファイルの最終更新日時を取得します。
Local $aFileTime = FileGetTime($sTargetFolder & "\" & $sFilePath, $FT_MODIFIED)
; 取得した日時データを使って、今日との差分日数を計算します。
Local $iDateDiff = _DateDiff('D', $aFileTime[0] & "/" & $aFileTime[1] & "/" & $aFileTime[2], @YEAR & "/" & @MON & "/" & @MDAY)
; もし差分日数が設定した日数以上なら、ファイルを削除します。
If $iDateDiff >= $iDaysOld Then
;~ FileDelete($sTargetFolder & "\" & $sFilePath)
ConsoleWrite($sTargetFolder & "\" & $sFilePath & @CRLF); 確認のため FileDelete をコメントアウトして ConsoleWrite に変更しています。
; 削除カウンターを1増やします。
$iDeletedCount += 1
EndIf
Next
; 処理が完了したことをメッセージで伝えます。
MsgBox($MB_OK, "完了", $iDeletedCount & "個の古い" & $sFileExtension & "ファイルを削除しました。")
コードの詳しい解説
#include から始まる行
File.au3はファイルリスト取得、Date.au3は日付計算、MsgBoxConstants.au3はメッセージボックス表示のために、それぞれ必要な関数群を読み込んでいます。
設定項目
Local $sTargetFolder = @WindowsDir & "\Temp"
Local $iDaysOld = 30
Local $sFileExtension = ".log"
この3つの変数を変更することで、スクリプトの動作をカスタマイズできます。
$sTargetFolder: どのフォルダーを掃除の対象にするか指定します。@WindowsDir & "\Temp"はWindowsの一時フォルダーを指定するマクロです。自分のドキュメントフォルダーなどに変更することも可能です。$iDaysOld: 何日以上前のファイルを削除対象とするかを数値で指定します。$sFileExtension: 削除したいファイルの拡張子を指定します。「.tmp」や「.bak」など、不要なバックアップファイルを対象にすることもできます。
_FileListToArrayRec(…)
指定したフォルダー($sTargetFolder)とそのサブフォルダー全てを対象に、指定したパターン("*.log")に一致するファイルを検索し、リストを配列として取得します。RecはRecursive(再帰的)の略で、これがサブフォルダーまで検索してくれる重要なポイントです。
FileGetTime(…)
ファイルのタイムスタンプを取得する関数です。第二引数の$FT_MODIFIEDで「最終更新日時」を指定し、第三引数の$FT_ARRAYで結果を年、月、日などの要素に分かれた配列として受け取ります。
_DateDiff(‘D’, …)
2つの日付の差分を計算する、非常に強力な関数です。
_DateDiff(‘D’, 開始年, 開始月, 開始日, 終了年, 終了月, 終了日)のように使います。
ここでは、ファイルの更新日時から今日までの差分を**日数(’D’)**で計算しています。
If $iDateDiff >= $iDaysOld Then …
_DateDiffで計算した経過日数が、設定項目で指定した$iDaysOld(例:30日)以上かどうかを判定しています。条件に一致した場合のみ、次の行のFileDelete()が実行されます。
FileDelete($sFilePath)
指定されたパスのファイルを削除する、シンプルで強力な関数です。この関数で削除したファイルはごみ箱には入らず、直接削除されるので、対象フォルダーの指定には注意してください。
まとめ
このスクリプトは、一度設定してしまえば、あとは実行するだけで PC のメンテナンスが完了する便利なツールです。
注意点として、重要なファイルを誤って削除しないよう、最初は FileDelete() の行をコメントアウト(行頭に;を付ける)して、どのファイルが対象になるか ConsoleWrite() などで確認しながらテストすることをおすすめします。
安全に注意しながら、ディスクの空き容量確保に役立ててください。
コメント