【実務・中級編】【ネットワークパス非同期監視】FileSystemObjectとSleepループを用いた共有フォルダ接続状態の自動リカバリ – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

ネットワークの「揺らぎ」を制御せよ:VBScriptによる共有フォルダ監視と自己修復の実践

現場で「共有フォルダが見つかりません」というエラーに泣かされるのは、もう終わりにしよう。

ネットワークドライブの切断は、インフラの宿命だ。VPNの瞬断、サーバーのパッチ適用、あるいは単なるWi-Fiの気まぐれ。これらを「例外」として放置し、スクリプトを停止させてしまうのはエンジニアの怠慢だ。

今日は、VBScriptとWSH(Windows Script Host)を駆使し、「沈黙するネットワーク」に対して自己修復能力を持たせるための、堅牢な監視モジュール設計を伝授する。

—

1. なぜ「単純なループ」ではいけないのか

多くの初学者は、単に `FSO.FolderExists` を無限ループさせるコードを書く。しかし、それは死を招く。

  • リソースリーク: `FileSystemObject` をループ内でむやみにインスタンス化し続けると、メモリ管理が甘いWSH環境では遅延と不安定化を招く。
  • CPUの暴走: `Sleep` を入れない、あるいは間隔が短すぎると、CPUを100%消費し、監視対象のサーバーどころかホスト側のOSまで応答不能にする。
  • 同期の罠: ネットワークの不調時、再接続要求がOSレベルでスタックし、スクリプトが「ゾンビ化」する。

我々が目指すべきは、「軽量で、かつOSに負荷をかけない生存監視」だ。

—

2. 堅牢な監視モジュールの設計指針

プロダクションレベルの自動化では、以下の3点を徹底する。

1. オブジェクトの再利用: ループの外側でFSOを生成し、内側ではメソッドのみを呼ぶ。
2. 指数バックオフの考慮: 接続失敗が続いた場合、リトライ間隔を徐々に広げることで、ネットワーク負荷を抑制する(今回は実用性を考慮し固定間隔で実装するが、設計思想には組み込む)。
3. WSHの利点を活かす: `WScript.Sleep` はCPUを解放する唯一の手段である。これを戦略的に使用する。

—

3. プロダクションコード:共有フォルダ自動リカバリ

このコードは、指定したパスが消滅している間、静かに待機し、復旧した瞬間に処理を再開する設計だ。

‘ — 監視設定 —
Const MONITOR_PATH = “\\Server\SharedFolder\Data”
Const RETRY_INTERVAL = 5000 ‘ 5秒おきにチェック
Const MAX_RETRIES = 12 ‘ 最大1分で諦める設定(必要に応じて調整)

Set fso = CreateObject(“Scripting.FileSystemObject”)

Function EnsureConnection(path)
Dim retryCount
retryCount = 0

Do While Not fso.FolderExists(path)
retryCount = retryCount + 1
WScript.Echo “警告: パスが見つかりません [” & path & “] リトライ: ” & retryCount

‘ 接続が切れている間はCPUを解放し待機
WScript.Sleep RETRY_INTERVAL

If retryCount >= MAX_RETRIES Then
EnsureConnection = False
Exit Function
End If
Loop

EnsureConnection = True
End Function

‘ — メイン処理 —
If EnsureConnection(MONITOR_PATH) Then
WScript.Echo “接続成功。処理を開始します。”
‘ ここに本来の業務ロジックを記述する
‘ 例: fso.MoveFile … etc
Else
WScript.Echo “致命的なエラー: ネットワーク復旧を確認できませんでした。”
WScript.Quit 1
End If

Set fso = Nothing

—

4. 現場で生き残るための「運用上の注意」

このモジュールを運用に乗せる際、以下の「落とし穴」を回避すること。

  • ファイルロックの競合: ネットワークが復旧した瞬間、即座にファイル操作を開始してはいけない。サーバー側で「ファイルの書き込み完了待ち」が発生している可能性がある。再接続確認後、念のために2〜3秒のバッファ(`WScript.Sleep 2000`)を入れるのが大人の流儀だ。
  • ログ出力の設計: `WScript.Echo` はダブルクリック実行時には表示されない。必ず `cscript.exe` で実行し、ログをテキストファイルへリダイレクト(`> log.txt 2>&1`)して保存する習慣をつけろ。
  • 権限の分離: ネットワークパスへのアクセスは、スクリプト実行ユーザーの権限に依存する。タスクスケジューラで実行する場合は「最上位の権限で実行する」にチェックを入れるだけでなく、実行ユーザーの認証情報を明示的に管理せよ。

最後に

VBScriptは、今や「レガシー」と呼ばれることもある。だが、OSに深く根を下ろし、数行のコードでインフラの脆弱性を補完できるこの言語の力は、クラウド全盛の今こそ再評価されるべきだ。

「エラーが出るのは仕方がない」。そこから先が、エンジニアの腕の見せ所だ。自動化とは、システムを「止めない」ことではなく、「止まったシステムを、いかにエレガントに復旧させるか」という哲学に他ならない。

君の作るツールが、明日からの現場を少しでも楽にすることを期待している。健闘を祈る。

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