VBScriptを掌握する極限の知見:FSOによる「安全な」ファイル・フォルダ存在チェックの極意
業務自動化の現場において、VBScriptは今なおレガシーシステムとの統合や、インフラのキッティング、簡易的なバッチ処理において現役で稼働し続けている。
しかし、そのシンプルさゆえに「とりあえず動く」だけの脆弱なコードが量産され、現場の運用者を苦しめているのもまた事実だ。
特に、ファイルシステムを操作する `Scripting.FileSystemObject`(以下、FSO)の扱いにおいて、この傾向は顕著である。
今回は、FSOの正しいインスタンス化の作法と、例外(ランタイムエラー)を事前に叩き潰す「堅牢な存在チェック(Safe Validation)」の設計思想を、実務直結のプロダクションコードとともに伝授する。
—
1. なぜ「甘い存在チェック」はシステムを殺すのか
VBScriptで最もやってはいけないアンチパターンは、エラー処理を怠ったまま直接ファイルを操作することだ。
‘ 【悪夢のアンチパターン】
Dim fso, file
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ ファイルが存在しない場合、ここで容赦なくスクリプトがクラッシュする
Set file = fso.OpenTextFile(“C:\Logs\app.log”, 1)
実務の現場では、ファイルが存在しないことは「異常系」ではなく、処理タイミングや前続プロセスの遅延による「想定内の揺らぎ」であることが多々ある。
ここでスクリプトが異常終了すれば、夜間バッチは止まり、翌朝の担当者の工数を無駄に奪うことになる。
プロのエンジニアであれば、「外部リソースは常に存在しないかもしれない」という性悪説に基づき、処理の前に必ず存在確認(ガード節)を挟まなければならない。
—
2. FSOの正しいインスタンス生成とメモリ管理の鉄則
FSOを利用する際、まず直面するのがインスタンスの生成だ。ここでVBScript特有のオブジェクトライフサイクルを意識する必要がある。
深く知るべきオブジェクトの挙動
`CreateObject(“Scripting.FileSystemObject”)` は、呼び出されるたびにCOMコンポーネントのインスタンスをメモリ上に生成する。
スクリプトが肥大化した場合、不要になったオブジェクトを放置するとメモリリークの原因となる(VBScriptのガベージコレクタは完璧ではない)。
処理が完了したら、必ず `Set fso = Nothing` を明示的に実行し、COM参照を解放する習慣をつけよ。これがプロダクションコードを書く者としての最低限の美学だ。
—
3. 【プロダクションコード】安全性を極限まで高めた実用スクリプト
以下のコードは、ファイルおよびフォルダの存在を厳格にチェックし、安全にロギングを行うテンプレートである。そのまま現場のツールに組み込んで欲しい。
‘ ==============================================================================
‘ スクリプト名: SafeFileOperationSample.vbs
‘ 概要 : FSOを用いた安全な存在チェックとファイル操作のテンプレート
‘ 備考 : 現場の業務自動化ツールにおける標準設計モデル
‘ ==============================================================================
Option Explicit
‘ メイン処理の実行
Main
Sub Main()
Dim fso
Dim targetFolder, targetFile
Dim fileStream
‘ 1. FSOインスタンスの生成
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ パス定義(環境に合わせて変更してください)
targetFolder = “C:\AutomationWork”
targetFile = targetFolder & “\app_status.txt”
‘ 2. フォルダの存在チェック & 自動生成(安全なガード節)
If Not fso.FolderExists(targetFolder) Then
WScript.Echo “[INFO] ターゲットフォルダが存在しません。新規作成します: ” & targetFolder
On Error Resume Next
fso.CreateFolder(targetFolder)
If Err.Number <> 0 Then
WScript.Echo “[ERROR] フォルダの作成に失敗しました。権限を確認してください。Error: ” & Err.Description
Set fso = Nothing
Exit Sub
End If
On Error GoTo 0
End If
‘ 3. ファイルの存在チェックによる分岐処理
If fso.FileExists(targetFile) Then
WScript.Echo “[INFO] ファイルが存在します。追記モードで開きます。”
‘ ForAppending = 8, Create = False
Set fileStream = fso.OpenTextFile(targetFile, 8, False)
Else
WScript.Echo “[INFO] ファイルが存在しません。新規作成して書き込みます。”
‘ ForWriting = 2, Create = True
Set fileStream = fso.OpenTextFile(targetFile, 2, True)
End If
‘ 4. データの書き込み
fileStream.WriteLine “[” & Now & “] 正常に処理が実行されました。”
fileStream.Close
WScript.Echo “[SUCCESS] すべてのファイル操作が安全に完了しました。”
‘ 5. オブジェクトの明示的な解放(メモリ管理の徹底)
Set fileStream = Nothing
Set fso = Nothing
End Sub
—
4. チーフアーキテクトからの実践的アドバイス
上記のコードには、現場で生き残るための幾つかの重要なプラクティスが組み込まれている。
1. `Option Explicit` の常時有効化
変数の宣言漏れによる暗黙のバグを防ぐため、すべてのVBScriptの先頭にこれを記述することはプロトコルである。
2. `FolderExists` と `FileExists` の使い分け
これらはパスの文字列を評価するだけで例外を投げない非常に優秀なメソッドだ。無駄な `On Error Resume Next` を乱発するよりも、これらの存在チェック関数で事前に安全地帯を確認する方が、コードの可読性が圧倒的に高まる。
3. ファイル作成・書込時の引数の意味
`OpenTextFile(path, iomode, create)` の第3引数(`create`)を文脈に応じて正しく制御せよ。存在チェックと組み合わせることで、意図しない上書きやファイル消失の事故を完全にブロックできる。
VBScriptは古い言語かもしれないが、その分だけ「書き手の設計思想」がモロにコードに出る。
基礎であるFSOの扱いをマスターし、現場で信頼される堅牢な自動化ツールを構築してほしい。
