【入門編】【自動削除】DateLastModifiedプロパティを用いた「30日以上前の旧ログファイル」定期クリーンアップ処理 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!日々のサーバー運用やローカルファイルの整理、本当にお疲れ様です。
「気づけばログファイルがハードディスクを圧迫している……」「古いファイルを一つずつ手動で削除するのは、もううんざりだ……」

そんな現場の悲鳴をスマートに解決するために、今回はVBScript(Visual Basic Scripting Edition)とFSO(ファイルシステムオブジェクト)を駆使して、「30日以上前の古いログファイルを自動で掃除するクリーンアップスクリプト」の作り方を徹底解説します。

マクロの記録ボタンを押すだけの世界から一歩進み、OSの根底を支えるスクリプトを自在に操れるようになると、あなたのエンジニアとしての武器は圧倒的に分厚くなりますよ。
ここをクリアすれば、VBScriptの基本と「ファイル操作の神髄」はバッチリです。さあ、一緒に扉を開けましょう!

—

なぜVBScriptなのか? ~枯れた技術が持つ圧倒的な現場力~

現代ではPythonやPowerShellなど、新しいスクリプト言語がたくさんあります。しかし、なぜ今あえてVBScriptなのでしょうか?

それは、「Windowsさえ入っていれば、特別なインストールや環境構築を一切せずに、メモ帳とダブルクリックだけで今すぐ動く」という、圧倒的なポータビリティ(可搬性)があるからです。
追加のランタイムも不要。社内のレガシーなサーバー環境であっても、セキュリティポリシーに阻まれずにそのまま動く。この「どこでも動く安心感」こそが、インフラ・運用保守の現場でVBScriptが今なお現役で愛され続けている理由です。

—

今回の自動化の肝:FSOとDateLastModified

今回のミッションを達成するためには、以下の2つの重要アイテムを使いこなす必要があります。

1. FSO (FileSystemObject)
Windowsのファイルシステム(フォルダやファイル)を自由自在に操るための魔法のオブジェクトです。「フォルダを開く」「中身を見る」「ファイルを消す」といった操作をすべてコードから行えます。
2. DateLastModified プロパティ
ファイルが「最後にいつ更新されたか」というタイムスタンプを保持しているプロパティです。これと現在日時を比較します。

判定のロジック

「現在の日付」から「ファイルの最終更新日」を引いた日数(`DateDiff`関数を使用)が 30日以上 であれば、容赦なく削除(`.Delete`)します。

—

実装コード:30日以上前のログを駆逐するスクリプト

それでは、開発の現場でそのままコピペして使える実用的なスクリプトを公開します。
デスクトップなどに `clean_logs.vbs` という名前で保存し、文字コードを `Shift-JIS`(またはBOM付きUTF-8)にしてお使いください。

‘ ==============================================================================
‘ スクリプト名: LogCleaner.vbs
‘ 概要: 指定したフォルダ内の「30日以上前」のログファイルを自動削除する
‘ 著者: チーフアーキテクト先輩
‘ ==============================================================================

‘ エラーハンドリングの有効化(万が一ファイルがロックされていても止まらないようにする)
On Error Resume Next

Option Explicit

‘ — [設定エリア] ————————————————————-
Dim targetFolderPath
targetFolderPath = “C:\MyApp\Logs” ‘ ← 掃除対象のフォルダパスをここに記述!

Dim retentionDays
retentionDays = 30 ‘ ← 保存期間(日)。この日数より古いものを削除します。
‘ ——————————————————————————

Dim fso, targetFolder, fileList, targetFile
Dim fileCount, deletedCount
Dim diffDays

‘ 1. FileSystemObjectの生成(OSのファイルシステムへのパスポート)
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 2. フォルダの存在チェック
If Not fso.FolderExists(targetFolderPath) Then
MsgBox “指定されたフォルダが存在しません: ” & vbCrLf & targetFolderPath, vbCritical, “エラー”
WScript.Quit
End If

‘ 3. フォルダオブジェクトの取得
Set targetFolder = fso.GetFolder(targetFolderPath)
Set fileList = targetFolder.Files

fileCount = 0
deletedCount = 0

‘ 4. フォルダ内の全ファイルをループ処理
For Each targetFile In fileList
fileCount = fileCount + 1

‘ 5. 現在時刻とファイルの最終更新日(DateLastModified)の差分(日単位)を計算
‘ “d” は日数を表します
diffDays = DateDiff(“d”, targetFile.DateLastModified, Now)

‘ 6. 30日以上経過しているか判定
If diffDays >= retentionDays Then
‘ エラーリセット
Err.Clear

‘ ファイルの削除実行
targetFile.Delete True ‘ Trueは読み取り専用ファイルも強制削除するフラグ

If Err.Number = 0 Then
deletedCount = deletedCount + 1
WScript.Echo “削除成功: ” & targetFile.Name & ” (経過日数: ” & diffDays & “日)”
Else
WScript.Echo “【警告】削除失敗(使用中などの可能性): ” & targetFile.Name
End If
End If
Next

‘ 7. 後片付けと結果報告
Set targetFile = Nothing
Set fileList = Nothing
Set targetFolder = Nothing
Set fso = Nothing

MsgBox “クリーンアップが完了しました。” & vbCrLf & _
“スキャンした総ファイル数: ” & fileCount & “件” & vbCrLf & _
“削除した古いログ: ” & deletedCount & “件”, vbInformation, “処理完了”

—

コードの深い解説:プログラマーが押さえるべき3つのポイント

ここからは、ただ動くだけではなく「なぜこの書き方をしているのか」というエンジニア視点の深い知見を共有します。

① `On Error Resume Next` の哲学

通常のプログラミングではエラーは即座に検知して止まるべきですが、ファイルシステムのバッチ処理においては「一部のエラーでスクリプト全体を止めない」ことが極めて重要です。
例えば、別のアプリケーションがログファイルを掴んでいて(ロックされていて)削除できない場合、そこでスクリプトがクラッシュすると、それ以降のファイルの掃除がすべて止まってしまいます。
そのため、エラーが発生したファイルはスキップしつつ、次のファイルの処理へ進むためにこの記述を入れています。

② `DateDiff(“d”, targetFile.DateLastModified, Now)` の仕組み

`DateDiff`関数は、2つの日時の差を計算します。

  • 第1引数 `”d”`:日単位で比較する指定
  • 第2引数 `targetFile.DateLastModified`:ファイルの最終更新日時
  • 第3引数 `Now`:実行現在時刻

「現在時刻 - 最終更新日」が設定した日数(30日)以上であれば、古いファイルとみなすという非常にシンプルかつ強力な判定ロジックです。

③ `targetFile.Delete True` の強制力

`.Delete` メソッドの引数に `True`(True = Force)を渡すことで、もしログファイルに「読み取り専用」属性がついていたとしても、強制的に削除を実行させることができます。運用現場では「なぜか読み取り専用になっていた」というトラブルが頻発するため、この `True` がエンジニアの命を救います。

—

陥りやすい罠とエラー回避の知見

初心者がこの領域で必ずハマる「罠」がいくつかあります。事前に知っておくことで、無駄なデバッグ時間をゼロにしましょう。

  • 罠1: サブフォルダ(階層)が消えない!

上記のコードは、指定されたフォルダの直下にあるファイルのみを対象としています。もし `C:\MyApp\Logs\2023\10\` のようなサブフォルダの中まで再帰的に掃除したい場合は、`targetFolder.SubFolders` をループして再帰関数を書く必要があります。まずは直下から始めるのが安全です。

  • 罠2: パスの最後にある「バックスラッシュ(\)」の有無

変数を結合する際、`C:\MyApp\Logs` のように最後に `\` が抜けていると、ファイル名と結合したときに `C:\MyApp\Logsfile.txt` になってしまい、ファイルが見つからないエラー(Path not found)を引き起こします。パスを扱う際は細心の注意を払いましょう。

—

まとめ:自動化の第一歩を踏み出したあなたへ

お疲れ様でした!今回は `DateLastModified` と `DateDiff` を用いた、実用的なログファイル自動クリーンアップ処理を解説しました。

このスクリプトを Windowsの「タスクスケジューラ」に登録し、毎日深夜0時に自動実行するように設定すれば、もう二度と「あ、サーバーの容量がパンクした!」と慌てて出社する必要はなくなります。

「手作業をコードに置き換え、自分の自由な時間を作り出すこと」——これこそが、エンジニアの最大の醍醐味です。
VBScriptの基本をマスターしたあなたなら、次はINIファイルの読み込みや、Excel操作の自動化など、どんな応用へも進んでいけるはずです。

日々の面倒なルーティンワークはプログラムにすべて任せて、私たちはもっとクリエイティブな仕事に熱中しましょう!それでは、次の自動化の現場でお会いしましょう。

タイトルとURLをコピーしました