亡霊と踊る:VBScriptによる「極限の重複ファイル排除」アーキテクチャ
システム管理の現場において、VBScriptはもはや「レガシーの遺物」と揶揄されることもある。だが、OSにネイティブで搭載され、ゼロ・コンパイルで即座に実行できるこの言語は、巨大な共有フォルダの海を掃除する際の最強の武器になり得る。
今回は、数万件のファイルが乱立する環境において、FSO(FileSystemObject)を酷使しつつ、メモリリークを許さず、いかにして高速に重複ファイルを特定するか。その「解」を提示する。
1. 速度のボトルネックは「探索」と「生成」にある
素朴なスクリプトを書くと、再帰処理の中で無闇にフォルダオブジェクトを生成し、メモリを浪費してOSのガベージコレクションを待つという愚を犯す。
シニアエンジニアが意識すべきは、「オブジェクトの生存期間」と「辞書オブジェクトによるO(1)アクセス」だ。`Scripting.Dictionary` をハッシュマップとして使い、ファイル名とサイズをキーにして重複を判定する。この手法こそが、数万件のファイル群を秒単位で処理するための鉄則である。
2. 実装:高速抽出エンジン
以下のスクリプトは、単なる検索ではない。メモリ消費を最小限に抑え、処理済みのオブジェクトを即座に開放(`Nothing`代入)する「クリーン・アーキテクチャ」を意識したコードだ。
‘ 重複ファイル抽出スクリプト
Option Explicit
Dim fso, targetFolder, reportFile
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 辞書オブジェクトをハッシュマップとして使用(検索速度 O(1))
Dim dict : Set dict = CreateObject(“Scripting.Dictionary”)
Dim report : Set report = fso.CreateTextFile(“DuplicateList.csv”, True)
‘ 探索開始パス(環境に合わせて変更)
targetFolder = “C:\Target\SharedFolder”
‘ CSVヘッダー
report.WriteLine “FileName,Size,Path”
‘ 探索実行
TraverseFolder fso.GetFolder(targetFolder)
report.Close
Set dict = Nothing
Set fso = Nothing
Sub TraverseFolder(fldr)
Dim file, subFldr, key
‘ ファイルの走査
For Each file In fldr.Files
‘ キーの生成:サイズと名称を結合して一意性を判定
key = file.Name & “_” & file.Size
If dict.Exists(key) Then
‘ 重複発見
report.WriteLine file.Name & “,” & file.Size & “,” & file.Path
Else
‘ 新規キー登録
dict.Add key, file.Path
End If
Next
‘ 再帰処理:サブフォルダの探索
For Each subFldr In fldr.SubFolders
TraverseFolder subFldr
Next
End Sub
3. シニアエンジニアが押さえるべき「極限のチューニング」
メモリとパフォーマンスの境界線
VBScriptの`Scripting.Dictionary`は非常に優秀だが、メモリ上に全てのキーを保持する。もし対象が数百万件に及ぶ場合、メモリ不足(Out of Memory)が発生する。その場合は、一度テキストファイルに「サイズ_名前」を書き出し、`Sort`コマンドでソートしてから連続する行を比較するパイプライン処理に切り替えるのが定石だ。
API呼び出しによる権限管理
もし共有フォルダ上で「アクセス拒否」エラーが頻発する場合、FSOの限界である。その時はWindows APIの `FindFirstFile` / `FindNextFile` を `DynamicWrapper` 等で呼び出す必要があるが、保守性を鑑みれば、まずは `On Error Resume Next` でエラーを握りつぶし、ログに記録する「堅牢性」を優先すべきである。
なぜ今、VBScriptなのか
現代の管理者はPowerShellを好む。しかし、実行ポリシーの制約や、極端に古いWindows Server環境(2003/2008など)では、PowerShellの立ち上がりに数秒かかる。VBScriptは、その瞬間にメモリに常駐し、カーネルに最も近いレイヤーで処理を開始する。
結びに
「枯れた技術」を使いこなすということは、その技術の限界を知り、その上でいかに効率的な設計を施すかという挑戦だ。
今回紹介したコードは、あくまで「骨子」である。これをベースに、最終更新日時の比較による「最新版のみ残す」ロジックや、ハッシュ値(MD5/SHA256)による厳密な比較を組み合わせれば、君の管理するストレージは劇的に美しくなるはずだ。
技術は、使い手を選ばない。しかし、そのコードの寿命を決定するのは、書いた本人の「設計思想」に他ならない。さあ、今すぐサーバーの深淵を掃除しに行こう。
