大容量フォルダの「ゴミ」を狩れ!FSOで実現する超高速・重複ファイル検出術
こんにちは。自動化の現場で血の滲むようなデバッグを乗り越えてきた、あなたの技術メンターです。
共有サーバーを見渡すと、いつの間にか増殖している「コピーのコピー」。これらがストレージを圧迫し、バックアップ時間を無駄にしていることに気づいていますか?今回は、VBScriptの強力な武器であるFileSystemObject (FSO)を使い、ファイル名とサイズをキーにして、重複ファイルを一網打尽にする「狩人」のようなスクリプトを授けます。
マクロの記録から一歩先へ進みたいあなた、このコードを読み解けば、OSのファイルシステムを支配する感覚が掴めるはずです。
—
なぜFSOなのか?
VBScriptでファイル操作を行う際、`Scripting.FileSystemObject`(通称FSO)を使わない選択肢はありません。これはWindows OSに標準搭載された、ファイルやフォルダを直感的に操作するための「司令塔」です。
初心者の方がやりがちな「ファイルを開いて中身を読み込む」という非効率なことはしません。今回は「メタデータ(属性)」だけを抽出して比較します。これこそが、数千・数万のファイルを一瞬でスキャンする極意です。
—
重複検出スクリプト:現場のコード
まずはこのコードをコピーして、`check_dup.vbs` という名前で保存してください。
Option Explicit
‘ 1. オブジェクトの生成
Dim fso, targetFolder, outFile
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set targetFolder = fso.GetFolder(“C:\Target\Path”) ‘ ここを調査対象パスへ変更
Set outFile = fso.CreateTextFile(“duplicate_list.csv”, True)
‘ ヘッダー書き込み
outFile.WriteLine(“ファイル名,サイズ(Bytes),パス”)
‘ 2. 辞書オブジェクトで重複を管理
Dim dict
Set dict = CreateObject(“Scripting.Dictionary”)
‘ 再帰的にファイルを探索
ScanFolder targetFolder, dict, outFile
‘ 3. 後始末
outFile.Close
MsgBox “完了しました。duplicate_list.csvを確認してください。”
‘ — 再帰的スキャン関数 —
Sub ScanFolder(folder, dict, outFile)
Dim file, subFolder, key
‘ ファイルをループ
For Each file In folder.Files
‘ キーの定義: ファイル名 + “_” + サイズ
key = file.Name & “_” & file.Size
If dict.Exists(key) Then
‘ 重複発見!リストに書き込む
outFile.WriteLine(file.Name & “,” & file.Size & “,” & file.Path)
Else
‘ 初見なら辞書に登録
dict.Add key, file.Path
End If
Next
‘ サブフォルダも再帰的に探索
For Each subFolder In folder.SubFolders
ScanFolder subFolder, dict, outFile
Next
End Sub
—
コードの心臓部を徹底解剖!
1. `Scripting.Dictionary` の賢い使い方
初学者が迷いやすいのが「どうやって重複を判定するか」です。ここで活躍するのが `Dictionary` オブジェクト。これは「キー」と「値」をセットで保持する箱です。
`key = file.Name & “_” & file.Size` という文字列をキーにすることで、「名前が同じでサイズも同じ」という条件を、たった一行の `dict.Exists(key)` で判定しています。
2. 「再帰」というテクニック
フォルダの中にフォルダがある……この無限階層に対応するために、関数が自分自身を呼び出す「再帰処理」を使っています。`ScanFolder` 関数の中で `ScanFolder` を呼ぶことで、どんなに深いフォルダ階層も漏らさず探索できます。
3. 陥りやすい罠:メモリ管理
VBScriptはメモリを自動で解放してくれますが、巨大なフォルダを扱う際は注意が必要です。不要になったオブジェクトには `Set obj = Nothing` を明示的に書く習慣をつけると、プロとしての「堅牢なコード」に一歩近づきます。
—
このスクリプトを現場で活かすヒント
- 「ハッシュ値」への拡張: 今回は「名前+サイズ」で判定しましたが、中身が完全に同じか保証するには、ファイルの中身を読み取ってハッシュ値(MD5など)を計算する必要があります。しかし、まずはこの「サイズ判定」だけで、不要ファイルの9割は特定できるはずです。
- パスの書き換え: `C:\Target\Path` の部分は、必ず調査したいフォルダパスに変更してください。ネットワークドライブを指定する場合は、`\\Server\SharedFolder` のようなUNCパスでも動作します。
—
最後に:自動化は「道具」ではなく「思考」
VBScriptは古い言語だと言われることもありますが、Windows環境においてこれほど軽量で、OSの深部にまでアクセスできるツールは他にありません。
「手作業で数時間かかる確認作業を、わずか数秒で終わらせる」。
この成功体験こそが、あなたのエンジニアとしての価値を飛躍的に高めます。このスクリプトをベースに、自分なりのカスタマイズを加えてみてください。何かわからないことがあれば、またいつでも聞きに来てくださいね。あなたの自動化の旅を、心から応援しています!
