【実務・中級編】【新規ファイル生成監視】WMI __InstanceCreationEvent クエリを用いたフォルダ内監視と自動トリガー発火 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを掌握せよ:WMIイベント駆動で実現する「ゼロ・レイテンシ」ファイル監視の極意

世の中の業務自動化ツールの大半は、無駄なループ処理を繰り返す「ポーリング監視」という病に冒されています。一定時間ごとにフォルダを覗きに行き、何もなければ眠る。この非効率極まりない実装が、サーバーのCPUを無駄に食いつぶし、ファイル生成から処理開始までの「空白の数秒間」を生み出します。

真の自動化エンジニアは、能動的に動くのではありません。OSそのものに「何かが起きたら俺を叩き起こせ」と命じるのです。

今回は、WMI(Windows Management Instrumentation)のイベントサブスクリプションを使い、ファイル生成をミリ秒単位で検知する「真のイベント駆動型スクリプト」の設計思想を伝授します。

—

1. なぜ「ポーリング」は悪手なのか

`Do…Loop`の中で`Sleep`を挟むような監視スクリプトは、以下の理由からプロダクション環境では即座に破棄すべきです。

  • リソースの浪費: 監視対象が増えるほど、ディスクI/OとCPU負荷が線形に増大する。
  • イベントの競合: ファイル生成中に処理が走ると、ロックエラーや破損データの読み込みを誘発する。
  • 保守性の欠如: タイミング調整のための「マジックナンバー(Sleepの秒数)」が、環境変化で即座に破綻する。

WMIの `__InstanceCreationEvent` を使えば、OSのカーネルレベルで発生するファイルシステムイベントをトリガーにできます。これにより、スクリプトは待機中はCPUを一切消費しません。

—

2. 実装の設計指針:堅牢なイベントリスナー

以下は、特定のディレクトリを監視し、ファイルが生成された瞬間にそのパスを捕捉するプロダクション級のコードです。

‘ =================================================================
‘ EventDrivenMonitor.vbs
‘ WMI __InstanceCreationEventを用いたファイル監視エンジン
‘ =================================================================
Option Explicit

Dim strComputer, strQuery, objWMIService, colEvents, objEvent

strComputer = “.”
‘ 監視対象パスをWMI形式にエスケープ(バックスラッシュは二重に)
‘ 例: C:\\MonitorFolder
Const MONITOR_PATH = “C:\\TargetFolder”

‘ WMIイベントクエリの核心
‘ TargetInstanceはCIM_DataFileクラス(ファイル)を監視
‘ DriveとPathを指定することで特定のフォルダに絞り込む
strQuery = “SELECT FROM __InstanceCreationEvent WITHIN 5 WHERE ” & _
“TargetInstance ISA ‘CIM_DataFile’ AND ” & _
“TargetInstance.Drive = ‘C:’ AND ” & _
“TargetInstance.Path = ‘\\TargetFolder\\'”

Set objWMIService = GetObject(“winmgmts:\\” & strComputer & “\root\cimv2”)
Set colEvents = objWMIService.ExecNotificationQuery(strQuery)

WScript.Echo “監視を開始しました: ” & MONITOR_PATH

Do
‘ イベントが発生するまでスレッドは完全に停止(CPU負荷0%)
Set objEvent = colEvents.NextEvent

‘ 次の自動処理(パース・移動など)を呼び出す
ProcessFile objEvent.TargetInstance.Name
Loop

Sub ProcessFile(filePath)
‘ ※重要:ここには堅牢なエラーハンドリングが必要
On Error Resume Next
WScript.Echo “検知: ” & filePath

‘ 実際のビジネスロジックはここへ
‘ データベース更新や外部API連携など

If Err.Number <> 0 Then
‘ ログファイルへの出力処理を推奨
End If
On Error GoTo 0
End Sub

—

3. 実務で勝つための「3つの絶対鉄則」

コードが動くのは最低条件です。現場で「壊れない」システムにするためには、以下の知見を注入してください。

① WITHIN句の最適値を見極める

`WITHIN 5` は「最大5秒の遅延を許容してポーリングする」という意味です。これを`1`にすれば即時性は増しますが、WMIの負荷が高まります。業務要件に合わせて調整すべきですが、通常は`3`~`5`が妥当なラインです。

② ファイルロックへの対策

ファイルが作成された「瞬間」は、OSがまだ書き込み権限を保持している場合があります。スクリプトが即座にファイルを開こうとすると「アクセス拒否」で落ちます。
対策: `ProcessFile`内では、ファイルにアクセスできるまで数十ミリ秒単位の小さなリトライループを回すか、`Scripting.FileSystemObject`でファイルサイズが変化しなくなるまで待機するロジックを必ず組み込んでください。

③ プロセスの永続化

VBScriptは不安定な環境下では突然死することがあります。

  • タスクスケジューラでの起動: 「ログオン時に実行」ではなく、「システム起動時に実行」を設定し、かつ「タスクが失敗した際のリスタート設定」を有効にしてください。
  • 自律監視: 自身が死んだ場合に備え、メインの監視スクリプトを監視する「番犬スクリプト(Watchdog)」を別プロセスで走らせるのが、プロの構築パターンです。

—

最後に:なぜ今、VBScriptなのか

「なぜPowerShellを使わないのか」という問いに対しては、こう答えます。
「実行環境のミニマリズム」です。VBScriptはWindows 2000時代から現代のWindows 11まで、一切の依存関係なしに、同じ挙動で動き続けます。クラウドの複雑な依存関係に疲弊したとき、この「原初的な安定性」が、現場を救う最後の砦になるのです。

さあ、このスクリプトを土台にして、あなたの現場の「手作業」を「瞬時の自動処理」へと昇華させてください。健闘を祈ります。

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