VBScriptを「野放し」にするな:WScript.Timeoutで構築する堅牢な業務自動化の防波堤
業務自動化の現場において、VBScriptは依然として強力な武器だ。しかし、多くのエンジニアが犯す最大の過ちは、「スクリプトが正常に終了すること」を前提にコードを書くことだ。
ネットワークドライブの瞬断、応答のないデータベース、あるいは予期せぬ無限ループ。これらが一度発生すれば、スクリプトはメモリを食いつぶしたままゾンビと化し、サーバーリソースを枯渇させる。
今回は、VBScriptを「プロの道具」に昇華させるための、最も基本的かつ最強の防御策――`WScript.Timeout`を用いた実行時間管理について解説する。
—
1. なぜ「無限待ち」は許されないのか
VBScriptを直接ダブルクリックで実行している場合、スクリプトがループに陥ってもOSはそれを「正常な処理」と判断し続ける。特に、`ADODB.Connection`や`MSXML2.XMLHTTP`を用いた外部連携では、相手側の応答が返ってこないだけで、スクリプトは永遠にフリーズする。
タスクマネージャーから手動で終了させる? そんな運用は自動化とは呼べない。
「自動化プロセスが、自動で死ねる設計になっているか」。これがプロとアマの分岐点だ。
—
2. 実装の核心:WScript.Timeout の制御
`WScript.Timeout`プロパティは、スクリプト全体の実行時間を秒単位で制限する。これを超える処理が行われた場合、WSHは強制的にスクリプトを終了させる。
【プロダクションコード】安全な実行を担保する設計
以下のコードは、長時間の外部処理を伴うスクリプトの冒頭に配置すべきテンプレートだ。
‘ =================================================================
‘ 業務自動化スクリプト・メインモジュール
‘ 目的:実行時間監視による安全なプロセス終了
‘ =================================================================
Option Explicit
‘ 1. 【極めて重要】スクリプト全体のタイムアウト時間を設定(秒単位)
‘ 業務ロジックの最大予測時間 + バッファ(余裕) を持たせること
WScript.Timeout = 60
Call Main()
Sub Main()
On Error Resume Next ‘ エラーハンドリングを有効化
‘ 外部ファイルやDB連携などの重い処理を記述
Call ProcessHeavyTask()
If Err.Number <> 0 Then
WScript.Echo “エラー発生: ” & Err.Description
‘ ここでログ出力や管理者にメール通知する処理を挟むのが定石
End If
On Error GoTo 0
End Sub
Sub ProcessHeavyTask()
‘ 擬似的な重い処理(無限ループのシミュレーション)
Do
‘ 何らかの処理
WScript.Sleep 1000
Loop
End Sub
—
3. 現場で「死なない」ためのアーキテクトの助言
単に`Timeout`を設定すれば全てが解決するわけではない。以下の3つの注意点を徹底せよ。
① タイムアウト値の「根拠」を明確にする
「とりあえず3600秒(1時間)」といった適当な値は捨てろ。
- 処理対象の件数 × 1件あたりの平均処理時間 + 50%のバッファ
- この計算式を算出できない処理は、そもそも自動化の設計が甘い。
② 外部連携は「個別」にタイムアウトを指定する
`WScript.Timeout`はスクリプト全体を殺す「最終手段」だ。`ADODB`や`XMLHTTP`を使う際は、オブジェクトごとの`CommandTimeout`や`Timeout`プロパティを併用せよ。
‘ 例: ADOの場合
Set conn = CreateObject(“ADODB.Connection”)
conn.CommandTimeout = 30 ‘ 個別に30秒でタイムアウトさせる
全体を殺す前に、個別の接続をタイムアウトさせエラーハンドリングで拾う方が、リカバリーの選択肢が広がる。
③ 終了時の「後始末」を怠るな
`WScript.Timeout`による強制終了は、メモリ上のオブジェクトを強制的に破棄する。ファイルを開いたまま、データベースのトランザクションを握ったまま落ちる可能性がある。
- トランザクションは最小範囲で完結させる
- ファイル書き込みは都度閉じる(Close)か、ストリームのフラッシュを徹底する
—
最後に:自動化とは「制御」である
VBScriptのようなレガシーな環境であっても、設計思想次第で極めて堅牢なシステムを構築できる。
「動けばいい」という考えは、いずれあなたの構築したシステムを崩壊させる。
タイムアウトを設定することは、単なるバグ対策ではない。「管理不能なプロセスを放置しない」というエンジニアの矜持だ。
今日からあなたの書くスクリプトの冒頭に、この一行を添えてほしい。それが、プロの自動化エンジニアへの第一歩となる。
