【入門編】【上級プロフェッショナル向け】ネットワーク切断時のRPCサーバー不可エラー(0x800706BA)に対するFSO再接続&自動自己復旧 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは! VBScriptの世界へようこそ。
現場でバリバリ自動化スクリプトを書いていると、避けて通れないのが「ネットワークの向こう側にある共有フォルダ」との戦いです。

社内のファイルサーバーやNASへアクセスしてファイルを読み書きするスクリプトを作ったものの、朝に出社したら「あれ?動いてない…」なんて経験、ありませんか?
特に無線LANの瞬間的な切断や、VPNのタイムアウト、サーバーのちょっとした機嫌斜めで、スクリプトは容赦なくクラッシュします。

今回は、そんな現場のエンジニアを絶望の淵に追いやるエラー、「RPCサーバーを利用できません。 (エラーコード: `0x800706BA`)」を華麗にいなし、自分で立ち直る「自己復旧型FSO(FileSystemObject)スクリプト」の極意を伝授します。

ここをクリアすれば、あなたの書くVBScriptは「おもちゃの自動化」から「プロ仕様の堅牢なインフラツール」へと一気に進化します。一緒にマスターしていきましょう!

—

1. なぜ「RPCサーバー不可エラー(0x800706BA)」が起きるのか?

VBScriptでネットワーク上のファイルを操作するとき、裏側ではWindowsのRPC(Remote Procedure Call)という通信プロセスの仕組みが使われています。

FSO(`Scripting.FileSystemObject`)を使って共有フォルダのファイルを触ろうとした瞬間、ネットワークがわずかコンマ数秒でも途切れると、FSOはこう叫びます。

> 「サーバーの向こう側に連絡がつかないよ!もう無理!」

これが、エラーコード `0x800706BA` の正体です。
厄介なのは、このエラーが発生した時点で、それまで保持していたFSOのオブジェクトやネットワークのセッション情報が「ゴミ」になってしまうこと。ただ単に「もう一回同じ命令を実行する」だけでは、絶対に復旧しません。

プロフェッショナルなコードとは、エラーが出たときに慌てず騒がず、「一度すべてをリセット(解放)し、ネットワークの息継ぎを待って、オブジェクトを作り直して再挑戦する」という一連のルーチンを自律的に行うものです。

—

2. ネットワーク耐性を持つ「自己復旧型」アーキテクチャ

では、実際のコードを見てみましょう。
今回は、不安定になりがちなネットワーク共有フォルダ(例: `\\fileserver\share\data.txt`)に対して、安全にテキストを書き込むプロシージャを例に取ります。

読者の皆さんが現場でそのままコピペして、パスを書き換えるだけで使える実用的なコードです。

Option Explicit

‘ 処理のメインエントリーポイント
Sub Main()
Dim targetPath
targetPath = “\\your-file-server\share\sample_data.txt”

Dim content
content = “【自動実行ログ】 実行日時: ” & Now()

‘ ネットワーク耐性を持たせた書き込み関数を呼び出す
If WriteFileWithAutoRecovery(targetPath, content, 3, 5000) Then
WScript.Echo “ファイルの書き込みに成功しました!”
Else
WScript.Echo “致命的なエラー: 最大試行回数を超えたため、処理を中断しました。”
End If
End Sub

‘ ==============================================================================
‘ 関数名: WriteFileWithAutoRecovery
‘ 概要: RPCエラー等のネットワーク切断を検知し、FSOの再生成とリトライを行う
‘ 引数:
‘ filePath – 対象ファイルのパス
‘ textData – 書き込むテキスト
‘ maxRetries – 最大リトライ回数
‘ waitMsec – リトライ前の待機時間(ミリ秒)
‘ 戻り値: Boolean (成功: True, 失敗: False)
‘ ==============================================================================
Function WriteFileWithAutoRecovery(filePath, textData, maxRetries, waitMsec)
Dim attempt
Dim isSuccess
isSuccess = False

For attempt = 1 to maxRetries
‘ エラーハンドリングをこのブロック内だけに限定する
On Error Resume Next

Dim fso, ts
‘ 1. FSOのインスタンスを生成(毎回新しく作り直すのがポイント!)
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 2. ファイル書き込み処理の試行
‘ ForAppending = 8, True = ファイルがない場合は作成
Set ts = fso.OpenTextFile(filePath, 8, True)

If Err.Number = 0 Then
‘ — 成功ルート —
ts.WriteLine textData
ts.Close
isSuccess = True

‘ オブジェクトの明示的な解放
Set ts = Nothing
Set fso = Nothing
On Error GoTo 0
Exit For

Else
‘ — エラー検知ルート —
Dim errNum
errNum = Err.Number

‘ エラーオブジェクトを安全にクリア
On Error GoTo 0

‘ オブジェクトの残骸を確実に破棄
Set ts = Nothing
Set fso = Nothing

‘ 特定のエラー(RPCサーバー不可: &H800706BA 等)か、一般的なネットワークエラーを判定
‘ ※ VBScriptのErr.Numberは10進数で評価されることが多いので注意
If errNum = -2147023174 Or errNum = &H800706BA Or errNum > 0 Then
WScript.Echo “警告: ネットワークエラーまたはRPC障害を検知しました (エラーコード: ” & errNum & “)。”
WScript.Echo “試行回数 ” & attempt & ” / ” & maxRetries & ” : ” & waitMsec \ 1000 & “秒後に再接続を試みます…”

‘ WScript.SleepでネットワークとOSの回復を待つ(ミリ秒単位)
WScript.Sleep waitMsec
Else
‘ ネットワーク以外の致命的なエラー(権限不足やファイルロック等)は即座に中断
WScript.Echo “致命的なエラーが発生しました。コード: ” & errNum
WriteFileWithAutoRecovery = False
Exit Function
End If
End If
Next

WriteFileWithAutoRecovery = isSuccess
End Function

‘ メイン処理の実行
Main()

—

3. コードのキモ:プロが押さえるべき3つのポイント

このコードが「なぜ現場で生き残れるのか」、その裏側の仕組みを解説します。

① エラー発生時は「オブジェクトを完全に捨てる」

ネットワークが切断された瞬間、変数 `fso` や `ts`(TextStream)は、生きていないゾンビのようなメモリ領域を指した状態になります。これを使い回そうとすると、VBScriptはさらなる混乱に陥ります。
エラー起きたら即座に `Set ts = Nothing` と `Set fso = Nothing` で完全にメモリから消し去り、次のループの頭で `CreateObject` からやり直す。これが自己復旧の鉄則です。

② `On Error Resume Next` の範囲を極限まで絞る

VBScriptのバグの温床になりやすいのが、雑なエラー抑制です。どこでエラーが起きても無視するように書くと、思わぬバグを見逃します。
今回は「ファイルを開いて書き込む」という、ネットワーク障害が起きうるピンポイントのブロックだけにエラー監視を限定し、それ以外は厳格にチェックしています。

③ 適切な「ウェイト(待ち時間)」を入げる

ネットワーク機器やVPNが瞬断から復旧するには、ほんの数秒の時間がかかります。エラーが起きてすぐ秒速でリトライするのではなく、`WScript.Sleep 5000`(5秒待機)などを挟んで、「サーバーが深呼吸する時間」を与えてあげるのが、優しく知的なエンジニアの気遣いです。

—

4. 陥りやすい罠とデバッグのコツ

  • 10進数と16進数のトラップ

VBScriptのエラー番号は、時と場合によってマイナスの10進数(`-2147023174`など)で返ってきます。コード内でエラー判定を行う際は、上記のサンプルコードのように `Err.Number` が「0以外(かつ致命的でないもの)」であれば一律でリトライ対象に含めてしまう設計にするのが、実務上は最も堅牢です。

  • ローカル環境でテストする場合

「本当にネットワーク切断時の挙動を確認したい!」という場合は、コード上のパスをあえて存在しないサーバー名や、ルーターの電源を落とした環境でテストしてみてください。ちゃんと指定回数リトライして、優しく諦めるログが出力されるはずです。

—

まとめ

いかがでしたか?
今回は、VBScriptにおけるFSO操作の最大の壁である「ネットワーク切断・RPCエラー」を正面から突破する、自己復旧型スクリプトの極意をお伝えしました。

「動けばいいや」ではなく、「現場の環境が荒れていても、勝手に粘り強く立ち直るコード」が書けるようになると、あなたの評価は社内で圧倒的に跳ね上がります。運用保守の手間が劇的に減り、夜中にアラートで起こされることもなくなるでしょう。

ここをクリアしたあなたなら、もうVBScriptの基礎はバッチリです!
ぜひ、日々の業務自動化の現場にこの堅牢なテクニックを取り入れてみてくださいね。それでは、次のステップでお会いしましょう!

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