VBScriptの真髄:FSOで綴る「可読性」という名のアーキテクチャ
VBScriptを「過去の遺物」と嘲笑う輩がいる。だが、Windowsの心臓部で数十年にわたり、一切の依存関係を求めず、ただ静かにシステムを支え続けてきたこの言語の真価を、彼らは知らない。
今回は、File System Object (FSO) を用いたログ生成の「美学」について語ろう。単なる書き込みではない。システム管理者が深夜の障害対応でログを開いたとき、その瞬間に状況を把握できるか否か。そこにエンジニアとしての矜持が宿る。
1. なぜ「WriteBlankLines」なのか
多くの初学者は、ログファイルに単に文字列を詰め込む。結果、ログは「情報の墓場」と化す。
`WriteBlankLines` メソッドは、単なる改行コードの挿入ではない。これは、ログストリームにおける「時間的・論理的区切り」を定義するアーキテクチャの境界線だ。
視認性の低いログは、監視対象ではない。それはただのノイズだ。
2. FileExistsを起点とする「防御的プログラミング」
ログ書き込みの直前、必ず `FileExists` を通す。これは単なる存在確認ではない。ログの追記モード(`ForAppending`)における排他制御や、ファイルポインタの生成コストを意識した設計だ。
以下のコードは、単なるログ出力関数ではない。堅牢なシステム運用のためのひな型である。
‘ 伝説的なチーフアーキテクトによるログ整形モジュール
Option Explicit
Const ForAppending = 8
Sub WriteSystemLog(strMessage, strLogPath)
Dim objFSO, objFile
‘ オブジェクト生成のオーバーヘッドを考慮し、最小限のスコープで扱う
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
‘ ファイルが存在しない場合はヘッダーを付与する等のメタデータ管理が可能
Dim isNewFile
isNewFile = Not objFSO.FileExists(strLogPath)
‘ ファイルを開く(エラーハンドリングは本来必須)
Set objFile = objFSO.OpenTextFile(strLogPath, ForAppending, True)
‘ 初回作成時のみ見出しを挿入するなどの「構造化」
If isNewFile Then
objFile.WriteLine “— LOG START: ” & Now() & ” —”
objFile.WriteBlankLines 1
End If
‘ メッセージと空行の挿入による視認性向上
objFile.WriteLine “[” & Now() & “] ” & strMessage
objFile.WriteBlankLines 1
‘ 厳密なメモリ解放。VBScriptにおいてSet Nothingを怠ることは、
‘ 長時間稼働するバックグラウンド処理でのメモリリークを招く
objFile.Close
Set objFile = Nothing
Set objFSO = Nothing
End Sub
3. チーフアーキテクトの視点:パフォーマンスと保守性
このコードには、現場で生き残るための「最適化の知見」が詰まっている。
- メモリの解放: VBScriptは参照カウント方式でガベージコレクションを行うが、大規模なバッチ処理において `Set Nothing` を明示しないのは怠慢だ。特に COM オブジェクトは、明示的に解放することで Windows のリソースプールを確実に開放できる。
- 構造化の恩恵: `WriteBlankLines 1` を挟むだけで、ログの読みやすさは劇的に変わる。後のテキスト解析ツール(PowerShellの `Get-Content` など)でログを拾い上げる際、空行が「レコードの区切り」として機能するのだ。
- レガシー環境での共存: このコードはWindows 2000世代からWindows Server 2022まで、全く同じ振る舞いを保証する。環境依存性を極限まで排除した、ポータビリティの高いコードこそが、真の資産となる。
4. 最後に:コードは「対話」である
ログはシステムが発する唯一の言語だ。その言語を丁寧に整えることは、将来の自分、あるいは後任のシステム管理者が直面するであろう「絶望的なデバッグ作業」を救うことと同義である。
VBScriptは古いかもしれない。だが、そこで培った「リソースを制御し、情報の構造を設計する」という思考は、どのモダンな言語に行こうとも変わらない。
次は、ADODB.Streamを用いたログの文字コード変換と、WMIによるログローテーションの自動化について深掘りするとしよう。……準備はいいか?
