【入門編】【排他制御・エラー回避】ファイルロック時に落ちないFSO操作とリトライループの実装パターン – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを「使い捨て」から「堅牢な自動化ツール」へ:FSO排他制御の極意

こんにちは。自動化の現場で血の滲むようなデバッグを乗り越えてきた、一人のエンジニアです。

VBScriptでファイル操作をしている時、突然「実行時エラー: 書き込みできません (Permission Denied)」という悪魔のようなメッセージに突き放されたことはありませんか?
これは、あなたが書いたコードが悪いわけではありません。「ファイルはいつでも自分だけが触れる」という甘い前提が、現実のWindows環境(Excelやバックグラウンドプロセスが常にファイルを狙っている世界)と合っていないだけなのです。

今回は、VBScriptの要である`FileSystemObject (FSO)`を使いこなし、どんな環境でもへこたれない「しぶとい自動化スクリプト」の書き方を伝授します。

—

1. なぜエラーは起きるのか?

Windowsにおいて、ファイルは「早い者勝ち」です。あなたが`OpenTextFile`や`DeleteFile`を呼び出した瞬間、別のプロセスが1ミリ秒でも早くそのファイルを握っていれば、FSOは例外を投げてスクリプトを停止させます。

これを防ぐ唯一の道は、「エラーを恐れず、エラーが起きたら少し待ってから再試行する」という、いわば「粘り強い交渉術」をコードに組み込むことです。

—

2. 現場で使える「リトライ付き」ファイル削除パターン

以下のコードは、ファイルが使用中であっても諦めずに3回まで再試行する、実戦的なテンプレートです。

Option Explicit

Dim fso, filePath, maxRetries, i, success
Set fso = CreateObject(“Scripting.FileSystemObject”)
filePath = “C:\Temp\target_file.txt”
maxRetries = 3

success = False
For i = 1 To maxRetries
On Error Resume Next ‘ エラーを無視して次の行へ進む(ここが重要!)

fso.DeleteFile filePath, True

If Err.Number = 0 Then
‘ エラーなし!成功したらループを抜ける
success = True
WScript.Echo “削除成功しました。”
Exit For
Else
‘ エラー発生時の処理
WScript.Echo i & “回目:ファイルがロックされています。待機中…”
Err.Clear ‘ エラー情報をクリア
WScript.Sleep 2000 ‘ 2秒間待機(CPU負荷を下げつつ解放を待つ)
End If

On Error GoTo 0 ‘ エラーハンドリングを通常に戻す
Next

If Not success Then
WScript.Echo “致命的エラー:規定回数リトライしましたが、ファイルが解放されません。”
WScript.Quit 1 ‘ 異常終了コードを返す
End If

—

3. コードの「魂」を読み解く:重要な3つのポイント

① `On Error Resume Next` の正しい使い方

VBScriptには、本格的な `Try…Catch` 構文が存在しません。そのため、エラーを意図的に握りつぶして制御をプログラム側に引き戻す必要があります。ただし、「必要な操作が終わったらすぐに `On Error GoTo 0` で解除する」のが鉄則です。これを忘れると、予期せぬバグが隠蔽され、デバッグ地獄に陥ります。

② `WScript.Sleep` はエンジニアの「間」

`WScript.Sleep 2000` は単なる足止めではありません。OSに対して「CPUのリソースを解放し、ファイルロックが解除されるまで他のプロセスを優先してくれ」という命令を送る、戦略的な「間」なのです。ここをケチると、リトライが高速すぎて逆にOSに負荷をかけ、事態が悪化します。

③ `Err.Clear` を忘れないこと

一度発生したエラー情報は、次にエラーが発生するまで `Err` オブジェクトに残り続けます。リトライごとに必ずクリアしないと、過去の亡霊が残ったままになり、2回目以降の判定が正しく行えません。

—

4. さらに上を目指すあなたへ:設計のヒント

このコードを関数化(Function化)してライブラリとして外出ししておくと、どんなプロジェクトでも使い回せる「最強の武器」になります。

エンジニアの心得:
「自動化コードは、人間が寝ている間に動くもの」。
エラーが起きて停止するスクリプトは、夜中にあなたを電話で起こす「目覚まし時計」になりかねません。今回紹介したようなリトライ処理を組み込むだけで、あなたのスクリプトは深夜のトラブルを自力で解決する「自律したエージェント」へと進化します。

「ここをクリアすれば、VBScriptの基本はバッチリ」です。
さあ、あなたのコードをより堅牢で、信頼できるものに書き換えてみてください。応援しています!

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