VBScriptを「使い捨て」から「堅牢な資産」へ――実行前診断モジュールの設計思想
現場でよく見る「動けばいい」という考え方で書かれたVBScriptは、環境依存の爆弾を抱えています。配布先の端末でCOMコンポーネントが未登録だったり、依存するDLLが欠落していたりして、数時間かかるバッチ処理が開始1分で落ちる……そんな経験はもう過去のものにしましょう。
真のエンジニアは、「処理を実行する前に、その実行が失敗しないことを証明する」ことから始めます。今日は、VBScriptの脆弱性を克服し、プロダクションレベルの堅牢性を確保するための「事前依存環境診断モジュール」の設計術を伝授します。
—
1. なぜ「その場しのぎのCreateObject」が失敗するのか
多くのコードが、いきなり `Set obj = CreateObject(“…”)` を記述します。これは「転ばぬ先の杖」を放棄した無防備な実装です。
VBScriptにおいて `CreateObject` が失敗すると、スクリプトは容赦なくランタイムエラーを吐き出し、プロセスは異常終了します。特に、自動化ツールがタスクスケジューラなどで非同期に動く場合、エラーログすら残らないケースが多発します。
解決策はシンプルです。
1. 静的チェック: ファイルパスや環境変数の確認。
2. 動的チェック: COMコンポーネントのインスタンス化テスト(`On Error Resume Next` を戦略的に使用)。
3. 早期離脱: 診断が失敗した時点で、処理を開始せずに「何が足りないか」を明示して終了する。
—
2. 実践:事前診断モジュール・テンプレート
以下は、私が大規模な業務自動化ツールを設計する際に必ず組み込む診断エンジンの骨格です。保守性を考慮し、チェックリストを配列で管理する設計にしています。
‘ — 診断モジュール (EnvironmentChecker.vbs) —
Option Explicit
‘ 診断項目定義
Dim requiredComs, requiredFiles
requiredComs = Array(“Excel.Application”, “Scripting.FileSystemObject”, “ADODB.Connection”)
requiredFiles = Array(“C:\Config\settings.ini”, “C:\Bin\shared.dll”)
If Not RunPreFlightCheck(requiredComs, requiredFiles) Then
WScript.Quit 1 ‘ 診断失敗時はここでプロセスを止める
End If
WScript.Echo “環境診断完了。メイン処理を開始します。”
Function RunPreFlightCheck(coms, files)
Dim i, fso, checkPassed
checkPassed = True
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 1. COMコンポーネントの存在確認
For Each i In coms
If Not IsComRegistered(i) Then
WScript.Echo “[エラー] コンポーネント未登録: ” & i
checkPassed = False
End If
Next
‘ 2. 外部ファイルの存在確認
For Each i In files
If Not fso.FileExists(i) Then
WScript.Echo “[エラー] 必須ファイル不在: ” & i
checkPassed = False
End If
Next
RunPreFlightCheck = checkPassed
End Function
‘ COMの登録状況を安全に確認する
Function IsComRegistered(progId)
Dim obj
On Error Resume Next
Set obj = CreateObject(progId)
If Err.Number <> 0 Then
IsComRegistered = False
Else
IsComRegistered = True
obj.Quit ‘ アプリケーションであれば閉じる
End If
On Error GoTo 0
End Function
—
3. この設計が「堅牢」である理由
1. 疎結合な構成
チェック対象のコンポーネントやファイルパスをロジックから切り離しています。設定ファイルや配列を書き換えるだけで、将来的な依存関係の変化にも対応可能です。
2. 局所的なエラーハンドリング
`On Error Resume Next` は全域に適用してはいけません。上記コードのように、`IsComRegistered` 関数の中に閉じ込めることで、他への影響を最小限に抑えています。
3. 実行環境の「可視化」
エラーが発生した際、「何が足りないのか」が即座にログやコンソールに出力されます。これにより、サポートデスクや運用担当者が「DLLの再登録が必要なのか」「設定ファイルが配置されていないのか」を即座に判断できます。
—
4. プロのエンジニアへのアドバイス
VBScriptは古い言語ですが、そのシンプルさは依然としてWindows管理業務において最強の武器です。しかし、「環境に依存する」という宿命を忘れてはいけません。
- DLLの依存関係: `RegSvr32` による登録が必要な外部ライブラリがある場合、診断ルーチンに `WScript.Shell.Run` での確認処理を含めるのも一つの手です。
- 権限の考慮: インスタンス化のテストは、実際の実行ユーザーと同じ権限で行わなければ意味がありません。`RunAs` でのテストも検討してください。
「動くコード」を作るのは初級者。「落ちないコード」を設計するのが中級者。そして「落ちたとしても、なぜ落ちたかを自ら告白するコード」を書くのが、我々アーキテクトの仕事です。
明日からの開発で、この診断ルーチンをぜひ標準装備してください。あなたの自動化ツールが、現場で信頼される堅牢な基盤へと昇華することを期待しています。
