VBScriptを掌握せよ:FSO書き込み競合を制する「指数バックオフ」実装術
業務自動化の現場において、VBScriptとFileSystemObject (FSO) は今なお強力な武器だ。しかし、この「古き良き言語」を現代のマルチタスクなWindows環境で運用する際、多くのエンジニアが避けて通れない壁がある。それが「エラー70(書き込み権限がありません)」という名の悪魔だ。
「なぜか時々動く」「再実行すると成功する」。そんな不安定なツールを、プロフェッショナルは許容しない。今回は、複数プロセスが同一ログファイルを奪い合う過酷な環境でも、決してへこたれない「堅牢なログ書き込みロジック」の極意を伝授する。
—
なぜ「単純な再試行」では不十分なのか
初心者が書くコードの典型は、単なる固定秒数のループだ。
‘ アンチパターン:固定待機
Do
On Error Resume Next
Set ts = fso.OpenTextFile(path, 8, True)
If Err.Number = 0 Then Exit Do
WScript.Sleep 100 ‘ ここが問題
On Error Goto 0
Loop
この実装には重大な欠陥がある。「同期的な衝突」だ。複数のプロセスが同時にアクセスし、同時にエラーを吐き、同時に100ミリ秒待機し、また同時にアクセスする。これでは無限ループに近い衝突が繰り返される。
我々が実装すべきは、「指数バックオフ(Exponential Backoff)」と「ジッター(Jitter)」を組み合わせた、衝突確率を数学的に減衰させるアルゴリズムである。
—
堅牢な書き込みロジックの実装
以下のコードは、単なる再試行ではなく、待機時間にランダム性を加えることで、衝突の連鎖を物理的に断ち切る設計となっている。
プロダクション環境向け実装例
‘ ログ書き込み関数:指数バックオフ・ジッター付き
Function SafeAppendLog(strPath, strContent)
Dim fso, ts, retries, waitTime
Dim Randomize
Set fso = CreateObject(“Scripting.FileSystemObject”)
retries = 0
Randomize ‘ 乱数生成器の初期化(重要)
Do While retries < 5 On Error Resume Next Set ts = fso.OpenTextFile(strPath, 8, True) ' 8 = ForAppending If Err.Number = 0 Then ts.WriteLine Now & " : " & strContent ts.Close SafeAppendLog = True Exit Function End If ' エラー発生:指数バックオフ + ジッターの計算 ' 2の乗数(2, 4, 8, 16...)に乱数を加え、システム負荷を回避 waitTime = (2 ^ retries) 100 + Int(Rnd 100) Err.Clear WScript.Sleep waitTime retries = retries + 1 On Error Goto 0 Loop SafeAppendLog = False ' 限界回数を超えた場合は失敗を通知 End Function ---
この設計が「現場」で評価される3つの理由
1. 乱数による「位相のズレ」生成
`Int(Rnd 100)` がこのコードの魂だ。すべてのプロセスが同じタイミングで再試行を試みる「コライディング」を、確率的に回避している。計算機科学の観点からも、イーサネットのCSMA/CD方式と同じ思想であり、最も枯れた、かつ確実な解法である。
2. リソースリークを許さないライフサイクル管理
FSOの `TextStream` オブジェクトは、エラーが発生した瞬間に適切に破棄されないと、ハンドルがOS側に掴まれたままになる。上記コードでは、再試行のループ外で都度インスタンスを評価・制御することで、メモリリークのリスクを最小化している。
3. 拡張性と保守性の担保
このロジックを関数化しておくことで、ログ出力だけでなく、DBの書き込みや共有フォルダ上の設定ファイル更新など、あらゆる「競合が発生し得るクリティカルセクション」に即座に流用可能だ。
—
最後に:エンジニアとしての矜持
VBScriptはレガシーと言われることもあるが、それは使う側の技術不足を言語のせいにしているに過ぎない。OSの深層を知り、競合のメカニズムを理解していれば、これほど軽量かつ強力な自動化ツールはない。
「とりあえず動く」コードから、「止まらない」コードへ。
今日からあなたの現場に、この指数バックオフの思想をインストールしてほしい。それが、世界最高峰の業務自動化エンジニアへの第一歩だ。
