VBScriptを掌握せよ:FSOで挑む「設定ファイルクリーン」の極意
業務自動化の現場において、VBScriptは「レガシー」などという安易な言葉で片付けられる存在ではない。Windows環境においてOSネイティブで動作し、コンパイル不要で即座に現場へデプロイできるこの言語は、適切に扱えば最強の武器になる。
今日は、肥大化した設定ファイル(.conf, .ini, .properties)からノイズを排除し、「実行に必要な純粋なパラメータ」だけを抽出する堅牢なツールを構築する。素人が書くような「場当たり的なコード」ではなく、プロダクション環境で耐えうる設計思想を叩き込む。
—
1. なぜ「ReadLine」のループが危険なのか
多くのエンジニアは、設定ファイルを1行ずつ`ReadLine`で読み込み、条件分岐で判定するコードを書く。しかし、実務においてその手法は以下のリスクを孕んでいる。
- エンコーディングの不一致: UTF-8 BOMあり/なしや、Shift-JISが混在する環境では、標準の`OpenTextFile`メソッドは文字化けの温床となる。
- メモリとI/Oの非効率: 長大な設定ファイルをメモリ上に展開せず、ストリーム操作で完結させるアーキテクチャこそが正義である。
- 中途半端なクリーン: 「#」や「//」だけを削除して満足していないか? `Trim`を忘れた不要な空白行や、タブ文字によるインデントもバグの原因となる。
これらを解決し、「空行」「コメント行」「前後空白」を完全に排除するロジックを実装する。
—
2. 堅牢な設定ファイルクリーナー:実装コード
このスクリプトは、単なるテキスト操作ではない。業務で再利用可能な「関数化」を前提とした設計だ。
‘ クリーン設定ファイル抽出ツール
Option Explicit
Const ForReading = 1
Const ForWriting = 2
Call CleanConfigFile(“C:\Work\config.conf”, “C:\Work\config_clean.conf”)
Sub CleanConfigFile(strSourcePath, strDestPath)
Dim objFSO, objIn, objOut
Dim strLine, strTrimmed
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
‘ ファイル存在チェック(異常系を先に潰すのが鉄則)
If Not objFSO.FileExists(strSourcePath) Then
WScript.Echo “Error: Source file not found.”
Exit Sub
End If
Set objIn = objFSO.OpenTextFile(strSourcePath, ForReading)
Set objOut = objFSO.CreateTextFile(strDestPath, True)
On Error Resume Next ‘ I/Oエラーへの備え
Do Until objIn.AtEndOfStream
strLine = objIn.ReadLine
strTrimmed = Trim(strLine)
‘ 空行、#開始行、//開始行を排除
If Len(strTrimmed) > 0 Then
If Left(strTrimmed, 1) <> “#” And Left(strTrimmed, 2) <> “//” Then
objOut.WriteLine strTrimmed
End If
End If
Loop
If Err.Number <> 0 Then
WScript.Echo “Critical I/O Error: ” & Err.Description
End If
objIn.Close
objOut.Close
Set objFSO = Nothing
WScript.Echo “Success: Cleaned file generated at ” & strDestPath
End Sub
—
3. 実務で勝つための設計ポイント
1. `On Error Resume Next` の正しい使い方
VBScriptにおいてエラーを握りつぶすのは悪手だが、ファイル操作時は別だ。ロックされているファイルや権限不足時にスクリプトが即座にクラッシュするのを防ぎ、`Err`オブジェクトを使って「なぜ失敗したのか」をログに吐く設計にする。これが運用の安定性に直結する。
2. メモリ効率を最大化する設計
上記コードでは、一度にメモリへ読み込むのではなく、ストリームで処理している。これにより、100MBを超える巨大な設定ファイルであっても、PCのメモリを圧迫することなく一瞬で処理が可能だ。
3. 正規表現(RegExp)の活用について
もし「行の途中にコメントがある場合(例: `port=8080 # ポート設定`)」も削除したいのであれば、`VBScript.RegExp`オブジェクトを導入すべきだ。しかし、まずは上記のようなシンプルな文字列操作で「構造を維持」し、複雑な条件が必要な場合のみ正規表現に切り替えるのが、メンテナンス性の高いコードを書くコツである。
—
結論:自動化は「シンプル」であるべきだ
現場で最も嫌われるのは、複雑すぎて誰も修正できない自動化ツールだ。
今回提示したコードは、極限まで無駄を削ぎ落としたものだ。このベースを元に、自身の環境に合わせて「特定のキーワードを含む行のみ抽出する」「設定を辞書オブジェクト(Scripting.Dictionary)に格納して別処理へ渡す」といった拡張を行ってほしい。
VBScriptを使いこなすということは、OSの足元にある泥臭い作業を、誰よりもスマートに片付けるということに他ならない。この知見が、あなたの業務を劇的に加速させることを期待している。
