【テクニカル・上級編】【圧縮前段処理】FSOで複雑な条件に合致するファイルだけを集めてZIP化用作業フォルダへ集約・整理するVBS – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

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は、今なおレガシーシステムの裏側で、静かに、しかし確実にインフラを支えている。洗練されたコードとは、機能することではなく「メンテナンスコストが極限まで低いこと」を指す。

この集約ロジックをテンプレートとして、あなたの環境に合わせてカスタマイズしてほしい。それができる者にのみ、伝説的な自動化エンジニアへの道が開かれる。

タイトルとURLをコピーしました