ネットワーク瞬断を恐れるな:FSOとUNCパスを掌握する「堅牢なレジューム設計」の極意
こんにちは。現場の最前線で自動化に命を懸けているエンジニアです。
皆さんは、ファイルサーバー(UNCパス)への大容量データ転送中に「ネットワークの瞬断」でスクリプトが止まり、翌朝泣く泣く最初からやり直した経験はありませんか?
VBScriptの`FileSystemObject (FSO)`は強力ですが、ネットワーク越しとなると非常に繊細です。今回は、単なるファイルコピーを超えた、「ネットワーク障害を前提とした自己修復型スクリプト」の設計思想を伝授します。
—
1. なぜFSOはネットワークで「弱気」になるのか?
FSOはOSと密接に結びついていますが、UNCパス(`\\Server\Share\file.txt`)を扱う際、ネットワーク層の切断を「致命的なエラー」として即座にシャットダウンします。
初心者がやりがちなのは、「エラーが出たら終了」というコードです。しかし、プロフェッショナルは「エラーは発生するものであり、いかにスマートに復帰させるか」を設計します。
陥りやすい罠
- タイムアウトの放置: ネットワークが重いだけで「ファイルが見つかりません」と勘違いする。
- リソースの開放忘れ: エラー発生時、ファイルポインタが掴まれたままになり、再接続してもアクセス拒否される。
—
2. 「自動再接続&リトライ」のアーキテクチャ
今回の設計思想はシンプルです。「エラーをキャッチし、pingで回線を物理確認し、net useで論理接続を再確立し、オフセット位置から再開する」。
以下のコードは、そのエッセンスを凝縮したものです。現場でそのまま応用できるよう、汎用的な関数として作成しました。
‘ — 堅牢なネットワーク転送スクリプト —
Option Explicit
Const MAX_RETRIES = 5
Const WAIT_TIME = 5000 ‘ 5秒待機
‘ メイン処理:ファイルを再接続付きでコピーする
Function RobustCopy(strSource, strDest)
Dim fso, shell
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set shell = CreateObject(“WScript.Shell”)
Dim retryCount
retryCount = 0
Do While retryCount < MAX_RETRIES On Error Resume Next fso.CopyFile strSource, strDest, True If Err.Number = 0 Then RobustCopy = True Exit Function Else ' エラー発生!ここからが腕の見せ所 WScript.Echo "転送失敗。再接続を試みます..." ' 1. pingで回線状況を確認 If shell.Run("ping -n 1 192.168.1.10", 0, True) = 0 Then ' 2. net useで認証を再確立(必要に応じて) shell.Run "net use \\Server\Share /persistent:yes", 0, True End If retryCount = retryCount + 1 WScript.Sleep WAIT_TIME End If On Error Goto 0 Loop RobustCopy = False End Function ---
3. コードの解説:ここが「プロの視点」です
1. `On Error Resume Next` の使いこなし:
通常は使うなと教わりますが、ネットワーク越しの不安定な操作では「防波堤」として機能させます。エラーを止めるのではなく、エラーを「値」として扱うのがポイントです。
2. `shell.Run` による外部コマンドの制御:
VBScript単体では、ネットワーク層のセッションを再確立するのは困難です。`net use`コマンドをバックグラウンド実行(第2引数を0にする)し、強制的にWindowsのネットワークスタックを叩き起こします。
3. レジューム設計の考え方:
上記のコードは`CopyFile`ですが、さらに大容量の場合、`OpenTextFile`でバイナリを分割読み込みし、書き込み位置(オフセット)を記録する変数を持つことで、真のレジューム機能が完成します。
—
4. まとめ:自動化エンジニアへのステップアップ
このスクリプトをマスターすれば、もうネットワークの瞬断に怯える必要はありません。
- 基本: FSOの`CopyFile`メソッドを理解する。
- 応用: `Err.Number`を監視し、状況に応じたリカバリロジックを組む。
- 極致: ネットワーク環境そのものを制御するコマンド(net use等)をVBScriptからオーケストレーションする。
VBScriptは古くからある言語ですが、OSの深淵を制御できる極めて強力なツールです。この「泥臭いエラーハンドリング」こそが、システムを止めないエンジニアの矜持(きょうじ)です。
次はぜひ、ログ出力機能を追加して、「いつ、何度目のリトライで成功したか」を追跡できるようにしてみてください。それが、あなたの自動化ツールを「信頼される業務システム」へ昇華させる第一歩になります。
何か分からないことがあれば、いつでも聞いてくださいね。応援しています!
