【実務・中級編】【処理同期】WScript.Sleep メソッドを活用した外部プロセス実行と待機制御の基礎 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを掌握せよ:WScript.Sleepで実現する「待ち」の美学と堅牢なプロセス制御

VBScriptは、現代のモダンな言語群と比較すれば確かに原始的だ。しかし、システム管理や業務自動化の現場において、その「軽量さ」と「即時性」は今なお強力な武器となる。

多くの初心者が犯す最大の過ちは、外部プロセスを起動した直後に次の処理へ突っ走ることだ。OSは非同期で動く。君が「Excelを開け」と命じても、OSは「承知した」と答えるだけで、実際にアプリケーションがメモリに展開され、制御を受け取れる状態になるまでには数ミリ秒から数秒のラグが存在する。

この「隙間」を埋める術を知らないエンジニアが書くコードは、例外処理の温床となる。今回は、`WScript.Sleep`を単なる「休止」としてではなく、「プロセス同期の制御信号」として昇華させる手法を伝授する。

1. なぜ「無限ループ」ではなく「リトライ制御」なのか

初心者はよく、単純な`Sleep`を固定値で挟む。
「とりあえず3秒待てば大丈夫だろう」という設計だ。これはプロフェッショナルではない。待機時間が長すぎれば自動化の効率が落ち、短すぎればファイルロックや「オブジェクトが作成されていません」というエラーを引き起こす。

真のアーキテクトは「待機」に条件を持たせる。 ファイルの生成やプロセスの生存を監視し、準備が完了した瞬間に次のステップへ移行する。これが「堅牢な設計」の第一歩だ。

2. 実践:外部プロセス待機とリトライ制御のプロトタイプ

以下は、外部アプリケーション(ここではExcel)の起動を監視し、最大リトライ回数まで待機するプロダクションレベルのコードだ。

Option Explicit

‘ メイン処理
Dim objShell, objExcel
Set objShell = WScript.CreateObject(“WScript.Shell”)

‘ 外部アプリケーション起動
objShell.Run “excel.exe”, 1, False

‘ 堅牢な待機処理の呼び出し
If WaitForObject(“Excel.Application”, 10, 500) Then
WScript.Echo “成功: Excelが起動しました。”
‘ 業務ロジックをここに記述
Else
WScript.Echo “失敗: タイムアウトしました。”
WScript.Quit 1
End If

‘ ———————————————————
‘ 関数名: WaitForObject
‘ 機能: 指定オブジェクトが利用可能になるまでリトライ待機する
‘ 引数: progID – 待機対象のID
‘ maxRetries – 最大リトライ回数
‘ sleepTime – 1回あたりの待機時間(ms)
‘ ———————————————————
Function WaitForObject(progID, maxRetries, sleepTime)
Dim i, obj
WaitForObject = False

For i = 1 To maxRetries
On Error Resume Next ‘ エラーを握りつぶして判定に回す
Set obj = GetObject(, progID)

If Err.Number = 0 Then
‘ オブジェクトが取得できた=起動完了
Set obj = Nothing
WaitForObject = True
Exit Function
End If

Err.Clear
On Error GoTo 0 ‘ エラーハンドリングを戻す

‘ 指定ミリ秒待機して再試行
WScript.Sleep sleepTime
Next
End Function

3. このコードが「プロダクション品質」である理由

このコードには、単なるスクリプトを超えた設計思想が詰まっている。

1. `On Error Resume Next` の限定的使用:
`GetObject`は対象が存在しないと即座にエラーを投げる。このエラーを意図的にキャッチし、正常系か異常系かを判定材料として利用している。
2. リソースの解放:
`Set obj = Nothing` を明示的に呼び出すことで、VBScript特有のCOMオブジェクト参照のリークを防いでいる。
3. スケーラビリティ:
最大リトライ回数と待機時間を引数化しているため、対象が重いデータベース連携であれ、軽いテキストファイル作成であれ、呼び出し側の要件に合わせて柔軟に調整可能だ。

4. 業務自動化の現場で守るべき「鉄則」

  • 「とりあえずSleep」を許容しない:

固定時間の待機が必要な場合でも、必ず定数(`Const WAIT_TIME = 1000`)として定義せよ。ハードコーディングされた数字は、半年後の君自身を苦しめることになる。

  • ファイルシステムの挙動を疑え:

ファイル生成待機を行う際は、ファイルが存在するかだけでなく、`Scripting.FileSystemObject`で「ファイルサイズが0バイトではないこと」や「排他ロックされていないこと」まで確認するのが、真に堅牢なエンジニアの作法だ。

  • CPU負荷の管理:

`WScript.Sleep`はOSに対して「このスレッドは休むからCPUリソースを他に回せ」というシグナルを送る。ループ内でSleepを入れないコードは、単なるCPUの無駄遣いである。

最後に:ツールは「書く」のではなく「構築する」もの

VBScriptは古い。しかし、OSの深部にアクセスできるそのパワーは健在だ。
今回紹介した待機制御のパターンを体得すれば、君の書くスクリプトは「気まぐれに失敗する脆弱なもの」から、「24時間365日、静かに正確に仕事をこなす機械」へと変わるはずだ。

技術は常に進化するが、プロセス同期という概念はいつの時代も変わらない。さあ、次はどんな自動化を構築する?

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