VBScriptを掌握する:FSOの限界を突破する「正規表現ファイル検索」の極意
こんにちは。自動化の現場でVBScriptの枯れた、しかし強力なパワーに何度も救われてきたエンジニアです。
皆さんは、`Scripting.FileSystemObject`(通称FSO)を使っていて、「あぁ、なぜこのオブジェクトはワイルドカード(`.log`など)によるファイル検索をサポートしていないんだ!」と歯噛みしたことはありませんか?
FSOの`GetFolder(path).Files`は、フォルダ内の全ファイルを無差別に列挙します。数千個のファイルがあるフォルダで、特定の拡張子や命名規則を持つファイルだけを抽出したいとき、力任せに全てを取得してif文で回すのは、パフォーマンス的にもコードの美学としても「三流」のやり方です。
今日は、VBScriptのもう一つの武器であるRegExp(正規表現)オブジェクトを組み合わせ、FSOの限界をエレガントに突破する「プロの走査テクニック」を伝授しましょう。
—
なぜFSOとRegExpを組み合わせるのか?
FSOは「ファイルシステムとの対話」に特化しています。一方で、RegExpは「複雑な文字列パターンの照合」に特化しています。
この2つを組み合わせることで、「OSのファイル構造をなぞりながら、脳内にある複雑な検索条件を瞬時に適用する」という、非常に高速かつ柔軟なフィルタリングが可能になります。
陥りやすい罠:文字列比較の甘さ
初心者がやりがちなのは、`If Right(filename, 4) = “.log” Then` といった安直な比較です。これでは「大文字・小文字の区別」や「正規表現による柔軟なパターンマッチング(例:`report_2023_.log`)」に対応できません。
—
【実践】ワイルドカード疑似実装コード
以下のコードは、指定したフォルダから正規表現を使って特定のファイルを抽出するテンプレートです。現場でそのまま使えるよう最適化しています。
‘ — フォルダ内のファイルを正規表現でフィルタリングするプロの作法 —
Option Explicit
Dim fso, folder, file, regEx, targetFolder, pattern
‘ 1. 設定値
targetFolder = “C:\Logs”
pattern = “^\d{4}_.\.log$” ‘ 例:2023_… .log といった形式のみ取得
‘ 2. オブジェクト生成
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set regEx = New RegExp
‘ 3. 正規表現の設定
regEx.Pattern = pattern
regEx.IgnoreCase = True ‘ 大文字・小文字を区別しない(適宜変更)
regEx.Global = True
‘ 4. フォルダチェック
If fso.FolderExists(targetFolder) Then
Set folder = fso.GetFolder(targetFolder)
‘ 5. ループ処理:ここが効率の要
For Each file In folder.Files
‘ 正規表現にマッチするものだけを抽出
If regEx.Test(file.Name) Then
WScript.Echo “マッチしました: ” & file.Name
‘ ここに実際の処理(ファイル移動やログ読み込みなど)を記述
End If
Next
Else
WScript.Echo “指定したフォルダが見つかりません。”
End If
‘ 6. メモリ解放の作法(VBScriptの基本)
Set regEx = Nothing
Set folder = Nothing
Set fso = Nothing
—
コードのポイント解説
1. 正規表現の「パターン」が命
`pattern = “^\d{4}_.\.log$”` の意味を理解しましょう。
- `^`:行の先頭
- `\d{4}`:数字4文字
- `_`:アンダースコアそのもの
- `.`:任意の文字が0回以上続く(これがワイルドカードの“に相当)
- `\.log`:`.log` という文字列(`.`は正規表現で特別な意味を持つため`\`でエスケープ)
- `$`:行の末尾
この書き方さえ覚えれば、どんな複雑なファイル名ルールにも対応できます。
2. オブジェクトのライフサイクルを意識する
VBScriptはメモリ管理が自動ですが、`Set … = Nothing` を行うのはエンジニアとしての「行儀」です。特に大量のファイルを走査するバッチ処理では、スコープを抜ける前に明示的に解放することで、メモリリークのリスクを最小限に抑えることができます。
3. なぜ「RegExp.Test」なのか
`RegExp.Execute` はマッチした文字列をコレクションとして返しますが、今回のような「判定だけが必要なケース」では、`Test`メソッドを使うのが最も高速です。不要なオブジェクト生成を避けることが、自動化ツールを「重くしない」秘訣です。
—
まとめ:ここをクリアすれば「VBScriptの達人」
FSOでファイルを取得し、RegExpで選別する。この「役割分担」を理解すれば、あなたの書くVBScriptは、ただの「マクロの延長」から「堅牢なシステムツール」へと進化します。
- FSOは「足」、RegExpは「目」です。
- 闇雲に全ファイルを処理させるのではなく、まず「目」で選別してから、必要なものだけに「足」を運ばせる。
この考え方は、他のどのプログラミング言語(VBA、Python、PowerShellなど)でも通用する普遍的な設計思想です。ぜひ、日々の業務自動化にこの「プロの知見」を取り入れてみてください。
さあ、次の自動化タスクでは、スマートな検索ルーチンを書いてみましょう!応援していますよ。
