VBScriptを再定義する:FSOによる「高効率・高信頼」なファイル集約アーキテクチャ
VBScriptは「レガシー」という言葉で片付けられがちだが、Windows環境におけるその即時性と特権親和性は、現代のスクリプト言語においても代替困難な武器である。
特に、大量のファイルを扱う「圧縮前段処理」において、FileSystemObject (FSO) を単なるファイル操作ツールと捉えているようでは三流だ。メモリリークを許さず、I/Oボトルネックを最小化し、後続の圧縮プロセスを疎結合にするための「極限の設計」をここに記す。
1. アーキテクチャの要諦:なぜ「集約」が必要なのか
大規模なシステム運用において、直接ソースをZIP化する行為は愚策である。パスの深さ制限、ファイルロック、権限エラーなど、圧縮プロセスを阻害する要因は多岐にわたる。
「まずは条件に合致するファイルだけを物理的に隔離し、単一のフラットなディレクトリに集約する」。この前処理こそが、圧縮失敗という致命的なリスクをゼロにする唯一の解だ。
2. 極限の知見:メモリ管理とオブジェクトのライフサイクル
VBScriptにおいて `Set obj = Nothing` を怠ることは、死を意味する。特に再帰的なフォルダ走査を行う場合、参照カウントの不適切な管理はメモリリークを誘発し、システム全体のパフォーマンスを徐々に蝕む。
また、`CopyFile` メソッドは非常に強力だが、OSのキャッシュを汚染する。大量のファイルを扱う際は、例外処理を徹底し、トランザクションの整合性を保つための「ロールバック(一時フォルダの初期化)」を設計に組み込む必要がある。
3. 実践コード:圧縮前段集約エンジン
以下は、ファイルサイズ、更新日時、拡張子の複合条件でフィルタリングを行い、一時フォルダへ集約するコードである。
‘ — 極限のファイル集約エンジン —
Option Explicit
Dim fso, shell, rootPath, workDir
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set shell = CreateObject(“WScript.Shell”)
‘ 設定値
rootPath = “C:\SourceData”
workDir = “C:\Temp\Export_” & Replace(Replace(Replace(Now, “/”, “”), “:”, “”), ” “, “”)
‘ 一時フォルダの初期化(疎結合のためのクリーンな環境構築)
If Not fso.FolderExists(workDir) Then fso.CreateFolder(workDir)
‘ 再帰的走査の開始
Call ProcessFolder(fso.GetFolder(rootPath))
‘ クリーンアップ(オブジェクトの明示的解放)
Set fso = Nothing
Set shell = Nothing
Sub ProcessFolder(folder)
Dim file, subFolder
‘ ファイル走査
For Each file In folder.Files
‘ 【極限の条件分岐】サイズ(100KB以上) かつ 更新日時(30日以内) かつ 拡張子(xlsx/pdf)
If file.Size > 102400 And DateDiff(“d”, file.DateLastModified, Now) < 30 Then
If LCase(fso.GetExtensionName(file.Path)) = "xlsx" Or _
LCase(fso.GetExtensionName(file.Path)) = "pdf" Then
' 重複ファイル名対策が必要な場合はここでハッシュ処理等を追加
On Error Resume Next
fso.CopyFile file.Path, workDir & "\" & file.Name, True
On Error GoTo 0
End If
End If
Next
' フォルダ再帰(スタックオーバーフローを避けるため構造を監視せよ)
For Each subFolder In folder.SubFolders
ProcessFolder(subFolder)
Next
End Sub
4. システム管理者への提言:パフォーマンスを極めるために
このコードを実戦投入する際、以下のポイントに注意してほしい。
- I/O負荷の制御: ネットワークドライブ上のファイルを扱う場合、`CopyFile` はI/Oボトルネックとなる。可能であれば、ローカルストレージ内で一度集約してから転送するフェーズを分けること。
- 例外処理の哲学: `On Error Resume Next` を広範囲で使うのは素人のやり方だ。特定のメソッド呼び出しの直前でのみ有効化し、即座に `Err.Number` を評価してログに残す。これが「止まらないシステム」を作る秘訣だ。
- 権限の考慮: システム管理者として、このスクリプトを「タスクスケジューラ」で実行する場合は、実行ユーザーの権限がコピー先・元に対して十分であることを確認せよ。また、ログファイル出力機能(`fso.CreateTextFile`)を追記し、追跡可能性を担保することは必須である。
結び:技術は「目的」ではなく「手段」
VBScriptは、今なおレガシーシステムの裏側で、静かに、しかし確実にインフラを支えている。洗練されたコードとは、機能することではなく「メンテナンスコストが極限まで低いこと」を指す。
この集約ロジックをテンプレートとして、あなたの環境に合わせてカスタマイズしてほしい。それができる者にのみ、伝説的な自動化エンジニアへの道が開かれる。
