VBScriptを極める:レジストリを用いた「プロセス間同期」の極意
業務自動化の現場で、VBScriptは今なお強力な武器だ。しかし、多くのエンジニアが「単一スクリプトの完結」という制約の中で苦闘している。並列起動した複数のプロセスが、互いの状況を知らずに暴走する……そんな経験はないだろうか?
本稿では、軽量かつ堅牢な「プロセス間同期」の解を提示する。ファイルロックのような複雑な排他制御に頼らず、Windowsレジストリを「共有メモリ」として活用するという、極めて実戦的なアーキテクチャだ。
—
なぜ「レジストリ」なのか?
ファイルベースの排他制御は、書き込み権限やネットワークドライブの遅延、何より「プロセス異常終了時の残骸(ロックファイル)」の処理に頭を悩ませる。
対して、レジストリはOSの基盤だ。OSが管理するメモリ領域への直接的なアクセスに近く、以下のメリットがある。
1. 即時性: OSが統合管理しているため、書き込み後の反映が極めて速い。
2. 自動クリーンアップ: ユーザーセッション終了時にOSが管理するリソースであり、不整合が起きにくい。
3. 低負荷: ファイルシステム上の競合を避けるためのI/O待ちが発生しない。
—
堅牢な同期メカニズム:実装の勘所
プロセス間同期において最も重要なのは「Read-Modify-Write」の原子性(Atomic)だ。これをVBScriptで擬似的に実現するためのテンプレートがこれだ。
実装コード:レジストリ同期モジュール
‘ — 堅牢なレジストリ同期用クラス —
Class SyncManager
Private ShellObj
Private Const REG_PATH = “HKEY_CURRENT_USER\Software\MyApp\Sync\”
Private Sub Class_Initialize
Set ShellObj = CreateObject(“WScript.Shell”)
End Sub
‘ 状態を更新(セマフォの代わりに使用)
Public Sub SetState(keyName, value)
ShellObj.RegWrite REG_PATH & keyName, value, “REG_SZ”
End Sub
‘ 状態を取得
Public Function GetState(keyName)
On Error Resume Next
GetState = ShellObj.RegRead(REG_PATH & keyName)
If Err.Number <> 0 Then GetState = “”
On Error GoTo 0
End Function
‘ 指定した条件になるまで待機(ポーリング)
Public Sub WaitForSignal(keyName, targetValue, timeoutSeconds)
Dim startTime : startTime = Timer
Do While GetState(keyName) <> targetValue
If (Timer – startTime) > timeoutSeconds Then
Err.Raise 999, “SyncManager”, “タイムアウト発生”
End If
WScript.Sleep 200 ‘ CPU負荷軽減のため0.2秒待機
Loop
End Sub
End Class
‘ — 利用例 —
Dim sync : Set sync = New SyncManager
‘ 他のプロセスが完了するのを最大60秒待つ
sync.WaitForSignal “TaskStatus”, “READY”, 60
WScript.Echo “同期成功:次の処理へ移行します”
—
現場で守るべき「3つの鉄則」
コードをコピペして終わりではない。プロダクション環境でバグを埋め込まないための設計思想を伝授する。
1. タイムアウトは「必須」である
無限ループは、プロセスがハングアップする最大の要因だ。「完了したら動く」ではなく、「完了しなかった場合にどう振る舞うか」を先に実装せよ。私の設計では、必ず`Timer`関数を用いたタイムアウト処理を組み込む。
2. 書き込みは「最小限」に
レジストリは高速だが、過度な頻度での書き込みはOSのレジストリハイブに負荷をかける。`WScript.Sleep`を適切に配置し、ポーリング間隔を200〜500ms程度に保つのがベストプラクティスだ。
3. 排他制御の「粒度」を意識せよ
この手法はあくまで「状態の共有(シグナル伝達)」に向いている。巨大なデータの受け渡しには向かない。巨大なデータはDBや一時ファイルに書き出し、レジストリには「処理完了フラグ」だけを書き込むのが、疎結合で保守性の高いアーキテクチャだ。
—
最後に:エンジニアとしての矜持
VBScriptは古い言語だと揶揄されることもある。だが、OSの機能を直接叩き、レジストリを操作してプロセスを制御する……。このレベルまで理解を深めれば、VBScriptは単なるレガシー言語ではなく、Windows OSを自在に操るための「魔法の杖」へと姿を変える。
あなたが書くコードが、明日の誰かの業務を救う。その重みを忘れず、堅牢な同期ロジックを実装してほしい。
何か不明点があれば、常に「OSがどう処理しているか」に立ち返れ。そこに全ての答えがあるはずだ。
