VBScriptで「待機」の呪縛を解く:WMIイベント監視によるリアルタイム処理の極意
こんにちは。現場で泥臭い自動化を積み重ねてきたエンジニアなら一度は直面する壁があります。それは「フォルダ監視のために、数秒おきにループさせてスキャンし続けるスクリプト」という、CPUに優しくない非効率な実装です。
「ファイルが来たら即座に動く」。この当たり前を実現するために、今回はWindowsの心臓部であるWMI (Windows Management Instrumentation) を叩き起こし、システムに「ファイルができたら教えてくれ」と命令を出す、イベント駆動型のアーキテクチャを伝授します。
マクロの記録で満足していたあなたへ。VBScriptの真の力を体験してみましょう。
—
なぜ「ループ監視」ではダメなのか?
初学者が最初に作る監視スクリプトは、大抵こうなります。
‘ 悪い例:CPUを食い潰すポーリング処理
Do
If FileExists(“C:\WatchFolder\data.txt”) Then
‘ 処理
End If
WScript.Sleep 5000 ‘ 5秒待機
Loop
これだと、処理が走っていない間もOSは常に「ファイルあるかな?」と確認を続けます。これはPCにとっても、あなたのスクリプトの品格にとっても、非常に残念な状態です。
今回紹介するのは、OSのイベント通知機能を利用する「イベント駆動型」の手法です。ファイルが作成された瞬間にWindowsがスクリプトを「叩き起こしてくれる」ため、CPU負荷は実質ゼロです。
—
実装:WMI __InstanceCreationEvent クエリ
以下のコードをコピーして、`monitor.vbs` として保存してください。
‘ WMI接続のセットアップ
Set objWMIService = GetObject(“winmgmts:\\.\root\cimv2”)
‘ 監視対象フォルダのパス(バックスラッシュは2つ重ねるのがWQLのルール)
strFolder = “C:\\WatchFolder”
‘ WQLクエリ:__InstanceCreationEventで生成を検知
‘ TargetInstance isa ‘CIM_DataFile’ でファイルに限定
strQuery = “SELECT FROM __InstanceCreationEvent WITHIN 5 WHERE ” & _
“TargetInstance ISA ‘CIM_DataFile’ AND ” & _
“TargetInstance.Drive = ‘C:’ AND ” & _
“TargetInstance.Path = ‘\\WatchFolder\\'”
‘ イベント監視の開始
Set colEvents = objWMIService.ExecNotificationQuery(strQuery)
WScript.Echo “監視を開始しました: ” & strFolder
Do
‘ イベントが発生するまで、ここで処理は完全に停止(CPU負荷ゼロ)
Set objEvent = colEvents.NextEvent
‘ イベント発生!
strFileName = objEvent.TargetInstance.Name
WScript.Echo “ファイル検知: ” & strFileName
‘ ここに次の自動処理(パースや転送など)を記述
‘ Call ProcessFile(strFileName)
Loop
—
コードの重要ポイントを噛み砕く
1. WQL (WMI Query Language):
`SELECT FROM __InstanceCreationEvent` は、システム内部の「生成イベント」を購読するSQLのような言語です。`WITHIN 5` は「最大5秒ごとの間隔でチェックする」という意味ですが、これはポーリングとは異なり、OS側のバッファで管理されるため非常に軽量です。
2. パスの書き方:
WMIではパスに `\` を使う際、プログラム言語の仕様として `\\` とエスケープする必要があります。ここが多くの初心者が躓くポイントです。
3. ExecNotificationQuery:
このメソッドが肝です。ここを実行すると、スクリプトは「待ち」のモードに入ります。PCのリソースを消費せず、OSからの呼び出しを静かに待機します。
—
陥りやすいエラーと回避策
- 「アクセス拒否」エラー:
WMIへのアクセスには管理者権限が必要です。コマンドプロンプトを「管理者として実行」した状態で `cscript monitor.vbs` を実行してください。
- イベントが拾えない:
監視対象のドライブ指定が間違っていることが多いです。`Drive = ‘C:’` と `Path = ‘\\WatchFolder\\’` の区切りを再確認してください。
- ファイルがロックされている:
ファイルが作成された「瞬間」は、まだコピー中である可能性があります。処理を叩く前に `WScript.Sleep 1000` を挟むなどして、ファイルが書き込み可能になるまで待機するロジックを噛ませるのがプロの現場の流儀です。
—
次のステップへ
このスクリプトは、いわば「自動化のトリガー」です。ここから関数を呼び出し、CSVをExcelで開いて整形したり、FTPでサーバーへアップロードしたりと、可能性は無限に広がります。
「定時実行」という古い考え方を捨て、「イベント発生時に即座に動く」というシステム本来の動きを体験すると、自動化の景色がガラリと変わるはずです。
ここをクリアしたあなたは、もう初心者ではありません。WMIというOSの深淵に触れた、立派な自動化エンジニアの入り口に立っています。さあ、次はどんな業務を自動化しますか?
