VBScriptを掌握せよ:一時ファイル管理の「絶対正義」と確実なクリーンアップ術
業務自動化の現場において、`FileSystemObject`(FSO)は最強の武器だが、同時に「最も無責任なコード」を生み出しやすい諸刃の剣でもある。
多くのエンジニアが犯す最大の過ちは、「一時ファイルを生成しっぱなしにする」ことだ。スクリプトがクラッシュするたびに、ユーザーのTEMPフォルダはゴミの山と化す。これは単なるディスク容量の問題ではない。ファイルロックによる競合、セキュリティ権限の不整合、そして何より「プロのエンジニアとしての美学の欠如」だ。
今日は、VBScriptで「安全に生成し、確実に消す」ための極限のパターンを授ける。
—
1. なぜ `GetTempName` だけでは不十分なのか
多くの入門書は `FSO.GetTempName` を推奨する。確かに名前はユニークだが、それだけでは足りない。重要なのは「存在の証明」と「排他制御」だ。
生成したファイルが既に他のプロセスに使われていないか。あるいは、スクリプトが異常終了した際に、残骸をどうハンドリングするか。これらを考慮しないコードは、本番環境に投入してはならない。
2. 堅牢な一時ファイル管理のアーキテクチャ
我々が目指すべきは、「自動廃棄を前提としたクラスライクな制御」だ。VBScriptにクラスの概念はあるが、メモリ管理を厳密に行う必要がある。今回は、確実にクリーンアップを行うための「定石」をコードに落とし込む。
プロダクション環境向け:確実な生成と破棄のテンプレート
Option Explicit
‘ メイン処理のラッパー
Call Main()
Sub Main()
Dim fso, tmpFile, tmpPath
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 1. 安全な一時パスの取得
tmpPath = fso.BuildPath(fso.GetSpecialFolder(2), fso.GetTempName())
On Error Resume Next ‘ エラー発生時もクリーンアップへ移行するためにトラップ
‘ 2. ファイル作成と操作
Set tmpFile = fso.CreateTextFile(tmpPath, True)
tmpFile.WriteLine “業務データ: ” & Now
tmpFile.Close
‘ ここで本来の重い業務処理(API連携やファイル変換など)を行う
‘ …
‘ 3. 終了処理(成功時)
If fso.FileExists(tmpPath) Then
fso.DeleteFile tmpPath, True
End If
‘ 4. エラーハンドリング(異常終了時)
If Err.Number <> 0 Then
WScript.Echo “Error Occurred: ” & Err.Description
‘ ここでログを出力し、確実にファイルを消す
If fso.FileExists(tmpPath) Then fso.DeleteFile tmpPath, True
End If
On Error GoTo 0
Set fso = Nothing
End Sub
—
3. 現場で生き残るための「3つの鉄則」
コードをコピペするだけでは足りない。以下の3点を設計思想として脳に焼き付けてほしい。
① 常に「異常終了」をデフォルトと考える
`On Error Resume Next` をただの回避策だと思ってはいけない。これは「異常終了してもシステム全体を汚さない」という、クリーンアップのための強力な盾だ。エラーハンドリングを怠ったスクリプトは、ただの「時限爆弾」である。
② ファイルパスの「直書き」は死を意味する
`C:\Temp\` と直書きするな。Windowsの環境変数 `TEMP` はユーザーやプロセスによって異なる。必ず `fso.GetSpecialFolder(2)` を使え。これはOSが推奨する一時領域であり、セキュリティ的にも最も安全だ。
③ データベース連携時の落とし穴
一時ファイルをDBのインポート用中間ファイルとして使う場合、「ファイルロック」に注意せよ。FSOでファイルを作成後、すぐにCloseしてファイルポインタを解放しなければ、DB側のロード処理が「アクセス拒否」で弾かれる。特に大規模なCSV処理では、Flush(書き出し完了)のタイミングが鍵となる。
—
最後に:自動化の真髄
「動けばいい」というコードは、数ヶ月後の自分を苦しめる。一時ファイルを綺麗に掃除するという行為は、単なる片付けではない。「システムのリソースを適切に管理する」というエンジニアの姿勢そのものだ。
このパターンを標準装備とし、あなたの書くスクリプトを「現場で誰からも文句を言われない、堅牢なプロダクト」へと昇華させてほしい。
次回のテーマは、VBScriptにおける「非同期API通信とタイムアウト制御」について掘り下げる。準備はいいか。
