【現場の知恵】VBScriptで「死んだファイル」を瞬時に検知せよ。FSOによる異常監視の極意
こんにちは。現場の最前線で自動化システムを組み上げているエンジニアです。
皆さんは、バッチ処理が終わったと思って安心していたら、「ログファイルが0バイトのまま止まっていた」「ログが異常肥大してディスクを圧迫していた」というヒヤリハットを経験したことはありませんか?
これらはシステム運用において「サイレント障害」と呼ばれます。エラーで停止したわけではないため、監視ツールも沈黙し、気づいた時には時すでに遅し……というケースです。今回は、VBScriptの要であるFileSystemObject (FSO) を使い、そんな異常ファイルを未然に叩き出す「番犬スクリプト」の作り方を伝授します。
—
1. なぜVBScriptで監視するのか?
「PythonやPowerShellがあるのに、なぜ今さらVBScript?」と思うかもしれません。答えはシンプルです。「環境を選ばないから」です。
古いWindows Serverや、セキュリティポリシーがガチガチで新しいランタイムを入れられない現場でも、VBScriptは「最初からそこにあり、安定して動く」唯一の味方です。この「環境依存ゼロ」という強みは、運用自動化において何物にも代えがたい武器となります。
—
2. 監視の核となる「FileSystemObject (FSO)」
FSOは、OSのファイルシステムを操作するための強力なオブジェクトです。これを使うことで、ファイルのメタデータ(サイズ、作成日時、更新日時など)に直接アクセスできます。
今回使うのは、`File` オブジェクトの `.Size` プロパティだけ。非常にシンプルですが、これこそが「健康診断」の要です。
—
3. 実装:異常ファイル検知スクリプト
以下のコードは、指定したフォルダ内のログファイルをスキャンし、「0バイト(生成失敗)」または「100MB超え(暴走)」を検知してリスト化するスクリプトです。
‘ — 設定エリア —
Dim targetFolder, limitMin, limitMax
targetFolder = “C:\Logs\App” ‘ 監視対象フォルダ
limitMin = 0 ‘ 下限(これ以下なら異常)
limitMax = 104857600 ‘ 上限(100MB。これ以上なら異常)
‘ — メインロジック —
Dim fso, folder, file
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ フォルダが存在するか確認(ここを怠ると即座にランタイムエラーになります)
If fso.FolderExists(targetFolder) Then
Set folder = fso.GetFolder(targetFolder)
For Each file In folder.Files
‘ サイズチェック
If file.Size <= limitMin Or file.Size > limitMax Then
WScript.Echo “[ALERT] 異常なファイルを発見しました”
WScript.Echo “ファイル名: ” & file.Name
WScript.Echo “サイズ: ” & file.Size & ” bytes”
WScript.Echo “—————————-”
End If
Next
Else
WScript.Echo “指定したフォルダが見つかりません。”
End If
‘ 後処理(オブジェクトの解放はVBScriptの作法です)
Set folder = Nothing
Set fso = Nothing
コードのここがポイント!
- `CreateObject(“Scripting.FileSystemObject”)`: これがFSOを召喚する呪文です。
- `folder.Files`: フォルダの中にあるファイルを一つずつ取り出すイテレータのような役割を果たします。
- `Set … = Nothing`: スクリプトが終了する前に明示的にメモリを解放する癖をつけましょう。小規模なスクリプトなら自動解放されますが、大規模なバッチ処理ではこの「行儀の良さ」がメモリリークを防ぎます。
—
4. 現場で陥りやすい罠と対策
① 「権限不足」でアクセス拒否される
フォルダ内にシステムファイルや他ユーザーのファイルが含まれていると、FSOが `Permission Denied (800A0046)` を吐いて停止します。
- 対策: `On Error Resume Next` を使い、エラーが発生したファイルはスキップするように制御構造を工夫しましょう。
② ファイルが「使用中」でサイズが取得できない
書き込み中のログファイルは、排他制御によりサイズプロパティにアクセスできないことがあります。
- 対策: `On Error Resume Next` でエラーを抑止しつつ、`Err.Number` をチェックして「アクセス不可」を記録するログ処理を組み込むのがプロの流儀です。
—
5. 最後に:ここをクリアすれば「運用自動化」の道が開ける
今回紹介したコードは、あくまで「基本の型」です。ここから発展させて、以下のように進化させるのが次のステップです。
- メール通知: CDO (Collaboration Data Objects) を使って、異常検知時に管理者のスマホへメールを飛ばす。
- ログ出力: `fso.CreateTextFile` を使い、監視結果をCSVとして毎日保存する。
- タスクスケジューラ: Windowsのタスクスケジューラに登録し、毎時実行させる。
VBScriptは、決して「古い技術」ではありません。「シンプルで、確実で、どこでも動く」という、エンジニアにとって最も信頼できる相棒なのです。
さあ、皆さんのサーバーにある「眠れる問題児たち」を、このスクリプトで叩き起こしてあげてください。何か詰まったら、いつでも戻ってきてくださいね。応援しています!
