【入門編】【マルチプロセス同期】Windowsレジストリを利用した別VBScriptプロセス間でのシグナル伝達と同期制御 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを極める:別プロセスを操る「レジストリ同期」の技術

こんにちは。自動化の深淵へようこそ。
VBScriptは古臭い言語だと思っていませんか? 確かにモダンな言語に比べれば機能は限定的です。しかし、WindowsというOSの心臓部(API)を直接叩けるこの言語は、正しく使えば「最強の軽量オートメーションツール」に化けます。

今回は、一歩進んだエンジニアを目指すあなたへ、「独立して動く複数のVBScript同士を、レジストリを使って握手させる(同期する)」という、現場で即戦力となるテクニックを伝授します。

なぜ「レジストリ」なのか?

通常、異なるプロセス間(別々に起動したスクリプト)は、メモリ空間が隔離されているため、直接データをやり取りできません。
本来なら「名前付きパイプ」や「ソケット通信」などの複雑な実装が必要ですが、VBScriptでそれをやるのは骨が折れます。

そこで登場するのがレジストリです。
レジストリはOSが管理するグローバルなデータベースです。「特定の場所にフラグを立てる」「数値を書き込む」という行為は、すべてのプロセスから共通して見えます。これこそが、VBScriptにおける最も手軽で強力な「通信ポスト」なのです。

実装の勘所:シグナル伝達の設計

今回は「プロセスAが処理を完了するまで、プロセスBが待機する」という同期処理を作ります。

レジストリを「信号機」にするイメージ

1. プロセスA(親): 処理が終わったら、レジストリキーに `1` を書き込む。
2. プロセスB(子): ループしながらレジストリを監視し、`1` になるまで待機する。

実践コード:同期制御の実装

このコードをコピーして、`Sender.vbs`(送信側)と `Receiver.vbs`(受信側)として保存してみてください。

1. 送信側(Sender.vbs):処理完了を通知する

‘ WScript.Shellオブジェクトの作成(レジストリ操作の要)
Set objShell = CreateObject(“WScript.Shell”)
strKey = “HKCU\Software\MyProject\SyncSignal”

WScript.Echo “処理中…”
WScript.Sleep 3000 ‘ 重い処理をシミュレート

‘ 完了フラグを立てる
objShell.RegWrite strKey, 1, “REG_DWORD”
WScript.Echo “処理完了!シグナルを送りました。”

2. 受信側(Receiver.vbs):シグナルを待機する

Set objShell = CreateObject(“WScript.Shell”)
strKey = “HKCU\Software\MyProject\SyncSignal”

WScript.Echo “シグナル待機中…”

‘ レジストリが1になるまでループ(ポーリング)
Do
On Error Resume Next ‘ 読み込みエラー(未生成時)を回避
val = objShell.RegRead(strKey)
On Error GoTo 0

If val = 1 Then Exit Do
WScript.Sleep 500 ‘ CPU負荷を抑えるためのインターバル
Loop

WScript.Echo “シグナルを検知!次の動作へ進みます。”

陥りやすい罠と対策

この実装で初心者が必ず躓くポイントを3つ、先輩としてアドバイスしておきます。

1. 「値がない」時のエラー

まだ一度もレジストリを書き込んでいない状態で `RegRead` を実行すると、スクリプトはエラーで強制終了します。上記のコードのように `On Error Resume Next` でエラーを握りつぶし、ループ内で `val` が空でないかをチェックするのが鉄則です。

2. CPUの焼き付き(ビジーウェイト)

ループの中に `WScript.Sleep 500` を入れないで回すと、そのスクリプトはCPUを100%近く使い込み、PCが重くなります。「待機処理には必ずインターバルを設ける」、これは自動化エンジニアの基本作法です。

3. レジストリの掃除

テストが終わった後、レジストリにゴミが残ると次回実行時に誤作動します。処理の最後には必ず `objShell.RegDelete` でキーを削除する後始末を忘れないようにしましょう。

ここをクリアすれば、あなたはもう「自動化の職人」です

この「レジストリ同期」ができるようになると、複数のタスクを順番に実行させたり、メインスクリプトからサブスクリプトへ状態を渡したりと、自動化の幅が劇的に広がります。

VBScriptは古い言語ですが、そのシンプルさゆえに「OSの仕組み」をダイレクトに学べる最高の教材です。この同期制御を使いこなせば、複雑な業務フローも一本の線のように美しく管理できるようになりますよ。

次は、これを応用して「排他制御(同時に複数のプロセスが動かないようにする)」に挑戦してみてください。それができれば、あなたはもう一人前の自動化アーキテクトです。

それでは、良い自動化ライフを!

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