VBScriptの深淵へ:FSOを「監査可能な要塞」に変える極意
こんにちは。現場で長年、泥臭い自動化と向き合ってきたエンジニアです。
VBScriptは、今や「レガシー」と呼ばれることも多いですが、Windows環境におけるその即時性とシンプルさは、他の言語には代えがたい武器になります。
しかし、多くの初心者が陥る罠があります。それは「ファイル操作を『書きっぱなし』にしてしまうこと」です。
業務自動化において、ファイル操作は「不可逆的な破壊行為」になり得ます。失敗した時に「いつ、誰が、何をしたのか」が分からなければ、システムは運用に耐えません。
今回は、File System Object (FSO) を使い、操作の前後を確実に記録する「監査ログフレームワーク」の設計思想を伝授します。
—
1. なぜ「監査ログ」が必要なのか?
例えば、VBScriptでファイルを移動させる時、単に `MoveFile` を呼ぶだけでは不十分です。
- 移動先のフォルダがロックされていたら?
- 移動中にネットワークが切断されたら?
- どのスクリプトが、どの権限で実行したのか?
これらを後から追跡できるように、「処理の前後をサンドイッチする」という発想が必要です。
—
2. 実装:監査機能を備えたFSOラッパー
以下は、操作前後のステータスをテキストログに書き出し、万が一の障害時に状況を把握するための基盤コードです。
‘ — 監査ログ管理クラスのような役割を果たすサブルーチン群 —
Option Explicit
Dim fso, logger
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ メイン処理:ファイルを安全に移動する
SafeMoveFile “C:\Source\Data.txt”, “C:\Dest\Data.txt”
Sub SafeMoveFile(sourcePath, destPath)
Dim user, startTime, status
user = CreateObject(“WScript.Network”).UserName
startTime = Now()
‘ 操作前の状態を取得(属性や存在確認)
If Not fso.FileExists(sourcePath) Then
WriteLog “ERROR”, user, “File not found: ” & sourcePath
Exit Sub
End If
WriteLog “INFO”, user, “START: Moving ” & sourcePath & ” to ” & destPath
On Error Resume Next ‘ エラーハンドリングの開始
fso.MoveFile sourcePath, destPath
If Err.Number <> 0 Then
WriteLog “CRITICAL”, user, “FAILED: ” & Err.Description
‘ ここでロールバック判断や管理者への通知を行う
Else
WriteLog “INFO”, user, “SUCCESS: File moved.”
End If
On Error GoTo 0
End Sub
‘ ログ書き出し用プロシージャ
Sub WriteLog(level, user, message)
Dim logFile, logStream
logFile = “C:\Logs\audit.log”
Set logStream = fso.OpenTextFile(logFile, 8, True) ‘ 8: ForAppending
logStream.WriteLine “[” & Now() & “] [” & level & “] [User:” & user & “] ” & message
logStream.Close
End Sub
コードのポイント
1. `On Error Resume Next`: これがVBScriptのエラーハンドリングの心臓部です。エラーが出てもスクリプトを止めず、`Err`オブジェクトを確認してログに記録します。
2. 追記モード (`8`): ログファイルを上書きせず、末尾に追記し続けることで「履歴」を残します。
3. ユーザー情報の取得: `WScript.Network` を使うことで、誰が実行した操作かを一意に特定できます。
—
3. 初心者が陥りやすい「3つの罠」
現場でよく見る「動かない」「壊れる」原因を挙げておきます。これだけは避けてください。
- 1. オブジェクトの解放漏れ: `Set fso = Nothing` を最後に書く癖をつけましょう。小規模なら無視されますが、長時間動くバッチではメモリリークの原因になります。
- 2. パスの指定ミス: `\` (バックスラッシュ) の書き忘れは定番です。変数でパスを扱う際は、常に `If Right(path, 1) <> “\” Then path = path & “\”` のようなチェックを挟むのがプロの知恵です。
- 3. ロックの考慮不足: 別のプロセスがファイルを開いている状態で書き込もうとすると、エラーになります。ログには必ず「ファイルが使用中である」ことを検知するロジックを入れましょう。
—
4. プロの視点:次の一歩へ
今回紹介したコードは、あくまで「ログを残す」ための最小構成です。
さらに上を目指すなら、以下のような拡張を考えてみてください。
- JSON形式でのログ出力: ログを解析しやすくするために、CSVやJSON形式で出力する。
- イベントログへの書き込み: Windows標準の「イベントビューア」にログを飛ばすことで、監視ツールとの連携が可能になります。
- トランザクションの概念: 移動に失敗した際、移動元に戻す(ロールバック)処理を `Else` ブロックに実装する。
VBScriptは、シンプルだからこそ「どう書くか」にエンジニアの魂が宿ります。
「動けばいい」コードから「運用に耐えうる」コードへ。この記事が、あなたの自動化ライフを一段上のレベルへ引き上げるきっかけになれば幸いです。
何か詰まったら、いつでも立ち返ってくださいね。応援しています。
