VBScriptで実現する「プロセス間通信」:レジストリとFSOを操る職人の技術
こんにちは。自動化の世界へようこそ。
普段、私たちはVBScriptを使って「1つのタスク」を終わらせることに集中しがちです。しかし、業務が複雑化すると「並行して動く複数のスクリプトが、お互いに状況を教え合いたい」という欲求が必ず生まれます。
Windowsには本来、高度なIPC(プロセス間通信)の仕組みがありますが、VBScriptには標準で「メールボックス」のような機能はありません。そこで我々エンジニアがとる選択肢が、「レジストリとFileSystemObjectを組み合わせた擬似パイプ」の実装です。
今日は、この「泥臭いけれど極めて強力な手法」を紐解いていきましょう。
—
なぜ「レジストリ」と「ファイル」なのか?
VBScriptが動くWSH(Windows Script Host)環境は、メモリ空間が各プロセスで独立しています。つまり、変数の中身を直接やり取りすることは不可能です。
そこで、「Windows全体からアクセスできる共通の掲示板」を使います。
- レジストリ(`WScript.Shell`の`RegWrite/Read`): 状態フラグや軽量なトリガーの管理に最適。OSがメモリ上にキャッシュするため非常に高速です。
- ファイルシステム(`Scripting.FileSystemObject`): 構造化されたデータや、少し長めのメッセージを受け渡すための「ポスト」として機能させます。
この2つを組み合わせることで、低遅延かつ堅牢な疑似IPCが完成します。
—
現場で使える「メッセージ通信」の実装コード
まずは、状態を書き込む「送信側」と、それを監視して受け取る「受信側」の骨子を公開します。
送信側(Sender.vbs):メッセージを投げる
Dim WshShell, FSO, msgFile
Set WshShell = CreateObject(“WScript.Shell”)
Set FSO = CreateObject(“Scripting.FileSystemObject”)
‘ 1. メッセージを一時ファイルに書き出す
Set msgFile = FSO.CreateTextFile(“C:\Temp\ipc_pipe.txt”, True)
msgFile.WriteLine “TASK_COMPLETED:100” ‘ 完了通知のデータ
msgFile.Close
‘ 2. レジストリに「更新フラグ」を立てる(受信側のトリガー)
WshShell.RegWrite “HKCU\Software\MyAutomation\Status”, 1, “REG_DWORD”
WScript.Echo “送信完了:受信側へ通知を送りました。”
受信側(Receiver.vbs):常に監視し、反応する
Dim WshShell, FSO
Set WshShell = CreateObject(“WScript.Shell”)
Set FSO = CreateObject(“Scripting.FileSystemObject”)
WScript.Echo “監視開始… [Ctrl+Cで終了]”
Do
‘ レジストリを監視して、フラグが立ったら処理を実行
On Error Resume Next ‘ キー未定義時のエラー回避
Dim status
status = WshShell.RegRead(“HKCU\Software\MyAutomation\Status”)
On Error GoTo 0
If status = 1 Then
‘ 処理を実行
ReadMessage()
‘ フラグを戻す(重要:無限ループを防ぐ)
WshShell.RegWrite “HKCU\Software\MyAutomation\Status”, 0, “REG_DWORD”
End If
WScript.Sleep 500 ‘ CPU負荷を抑えるためのウェイト
Loop
Sub ReadMessage()
Dim f, content
Set f = FSO.OpenTextFile(“C:\Temp\ipc_pipe.txt”, 1)
content = f.ReadAll
f.Close
WScript.Echo “受信したメッセージ: ” & content
End Sub
—
ここをクリアすれば一人前!陥りやすい罠と対策
1. 「排他制御」という名の聖域
複数のスクリプトが同時にファイルに書き込もうとすると、`Permission Denied`エラーが発生します。
対策: ファイルを書き込む前に「ロックファイル(`lock.tmp`等)」の存在確認を行うか、書き込み成功まで`Err`オブジェクトを監視するリトライ処理を必ず実装してください。
2. レジストリ汚染
スクリプトが終わってもレジストリが書き換わったままになると、次回起動時に誤作動します。
対策: スクリプトの終了時に必ず`RegDelete`を行うか、初期化処理を徹底してください。
3. CPU負荷の罠
`Do…Loop`の中に`WScript.Sleep`を入れ忘れると、受信側が全CPUリソースを食いつぶしてしまいます。
対策: `Sleep 100`〜`500`ミリ秒程度入れるだけで、現代のPCなら十分に滑らかな通信が可能です。
—
最後に:なぜ今、VBScriptなのか?
「今はPowerShellやPythonの時代では?」という声が聞こえてきそうです。確かにその通りです。しかし、「インストール不要で、どのWindows環境でも即座に、かつ軽量に動く」というVBScriptの特異な強みは、業務自動化の現場で今なお無敵の武器です。
今回紹介した「レジストリとファイルによる通信」は、単なる技術的な遊びではありません。「疎結合(パーツ同士が独立している)」な設計思想を学ぶための第一歩です。
この仕組みをマスターすれば、あなたは単なる「スクリプトを書く人」から、複数の部品を組み合わせて「システムを構築するエンジニア」へ進化できます。
さあ、次はあなたの業務で、このパイプをどう繋ぐか考えてみてください。応援していますよ。
