VBScriptを掌握する極限の知見:【スケルトン構造複製】巨大フォルダの「骨組み」だけを秒速でミラーリングする技術
開発現場において、大容量のファイルサーバーやログ保管庫の整理・移行プロジェクトに直面したことはないだろうか。
「数テラバイトに及ぶ過去のデータ資産があるが、フォルダの階層構造(ディレクトリツリー)だけを新しい環境に先行して再現し、アクセス権や分類ルールのテストを行いたい」
こうした要件に対し、エクスプローラーの手動操作や、巨大な実ファイルまで巻き込んだ無謀な丸ごとコピーを行うのは、エンジニアの恥だ。ネットワーク帯域を圧迫し、I/Oの嵐を引き起こし、最終的にはフリーズする。
今回は、VBScriptの真骨頂であるFileSystemObject(FSO)を極限までチューニングし、実ファイルを1バイトもコピーせずに、フォルダの骨組み(スケルトン構造)だけを完璧にミラーリングするプロダクション・グレードの自動化ツールを解説する。
—
なぜ「単純な再帰処理」では現場で破綻するのか?
多くの初学者が書くFSOを使ったフォルダ走査コードは、以下のようなナイーブな実装になりがちだ。
- `SubFolders` をループさせ、見つけた先から `CreateFolder` を叩く。
- エラーハンドリング(`On Error Resume Next`)を雑に入れ、失敗した理由すらログに残さない。
- パスの深さ(Deep Path)や長すぎるパス名(MAX_PATH制限)への配慮がない。
実務でこれをやると、アクセス権限がないフォルダにぶ当たった瞬間に処理が止まるか、ゾンビプロセスのようにメモリを食い潰す。
プロのアーキテクトが満たすべき要件は、「堅牢性」「トレーサビリティ」「ミニマムなオーバーヘッド」の3点だ。これをVBScriptのプリミティブな機能だけで美しく実装する。
—
プロダクションコード:スケルトン構造複製エンジン
以下のコードは、エラーハンドリング、パスの正規化、そして実行結果のコンソール出力(あるいはログ出力)を完璧に網羅した実用スクリプトである。メモ帳に貼り付け、拡張子を `.vbs` として保存すれば即座に稼働する。
‘ ==============================================================================
‘ Script Name : SkeletonFolderMirror.vbs
‘ Description : 実ファイルを一切コピーせず、フォルダ構造のみを指定先に完全複製する
‘ Author : Chief Architect
‘ ==============================================================================
Option Explicit
Private objFSO, processedCount, errorCount
Set objFSO = WScript.CreateObject(“Scripting.FileSystemObject”)
‘ — 【設定エリア】 —
Dim sourceRoot, destRoot
sourceRoot = “C:\DataStorage\SourceArchive” ‘ コピー元のルートフォルダ
destRoot = “C:\DataStorage\SkeletonMirror” ‘ コピー先のルートフォルダ
‘ ———————-
‘ 実行時間の計測開始
Dim startTime
startTime = Timer
WScript.Echo “=== スケルトン構造複製プロセスを開始します ===”
WScript.Echo “Source : ” & sourceRoot
WScript.Echo “Target : ” & destRoot
WScript.Echo “————————————————–”
processedCount = 0
errorCount = 0
‘ ルートの存在確認
If Not objFSO.FolderExists(sourceRoot) Then
WScript.Echo “[FATAL ERROR] コピー元フォルダが存在しません: ” & sourceRoot
WScript.Quit 1
End If
‘ コピー先ルートの自動生成(存在しない場合のみ)
If Not objFSO.FolderExists(destRoot) Then
On Error Resume Next
objFSO.CreateFolder(destRoot)
If Err.Number <> 0 Then
WScript.Echo “[FATAL ERROR] コピー元ルートの作成に失敗しました: ” & Err.Description
WScript.Quit 1
End If
On Error GoTo 0
End If
‘ 再帰処理の呼び出し
Call MirrorFolderStructure(objFSO.GetFolder(sourceRoot), destRoot)
‘ 完了レポート
WScript.Echo “————————————————–”
WScript.Echo “=== 処理が完了しました ===”
WScript.Echo “作成されたフォルダ数 : ” & processedCount
WScript.Echo “エラー発生数 : ” & errorCount
WScript.Echo “実行時間 : ” & FormatNumber(Timer – startTime, 2) & ” 秒”
Set objFSO = Nothing
WScript.Quit 0
‘ ==============================================================================
‘ サブルーチン: 再帰的にフォルダ構造を走査・作成する
‘ ==============================================================================
Sub MirrorFolderStructure(currentSourceFolder, currentDestPath)
Dim subFolder, targetFolderPath
Dim colSubFolders
On Error Resume Next
Set colSubFolders = currentSourceFolder.SubFolders
If Err.Number <> 0 Then
WScript.Echo “[WARNING] アクセス拒否または読込エラー: ” & currentSourceFolder.Path
errorCount = errorCount + 1
Err.Clear
Exit Sub
End If
On Error GoTo 0
For Each subFolder in colSubFolders
‘ コピー先での対応するフォルダパスを算出
targetFolderPath = objFSO.BuildPath(currentDestPath, subFolder.Name)
‘ フォルダが存在しない場合のみ作成
If Not objFSO.FolderExists(targetFolderPath) Then
On Error Resume Next
objFSO.CreateFolder(targetFolderPath)
If Err.Number = 0 Then
processedCount = processedCount + 1
‘ 冗長な出力を避け、進捗を視覚化したい場合はコメントアウトを解除
‘ WScript.Echo “[CREATED] ” & targetFolderPath
Else
WScript.Echo “[ERROR] フォルダ作成失敗 (” & Err.Description & “): ” & targetFolderPath
errorCount = errorCount + 1
Err.Clear
End If
On Error GoTo 0
End If
‘ 再帰呼び出し(深さ優先探索)
Call MirrorFolderStructure(subFolder, targetFolderPath)
Next
End Sub
—
現場のエンジニアなら気づくだろうが、このコードにはVBScriptを扱う上で極めて重要な設計思想が組み込まれている。
1. `BuildPath` メソッドの徹底活用
文字列結合(`path & “\” & subfolder`)でパスを生成する素人が多すぎるが、これはスラッシュの重複や欠落バグの温床となる。FSOの `BuildPath` メソッドを使用することで、OSのパス区切り文字の差異やスラッシュの有無を完全に吸収し、堅牢なパス結合を担保している。
2. 局所的なエラーハンドリング(Fail-Safe Design)
ネットワーク共有フォルダを巡回する際、特定のサブフォルダに「アクセス権限がない(Access Denied)」ケースは日常茶飯事である。
スクリプト全体を `On Error Resume Next` で汚染するのではなく、危険を伴うセクション(`SubFolders` の取得や `CreateFolder`)の直前だけに限定してエラー捕捉を行い、失敗したフォルダはスキップしつつ、処理自体は最後まで完走する設計にしている。これがプロのコードだ。
3. メモリリークを防ぐオブジェクトのライフサイクル管理
VBScriptのCOMコンポーネント管理は甘く見られがちだが、巨大なツリー構造を再帰処理する際、不必要なオブジェクト変数の残留はメモリ枯渇を引き起こす。
コレクションの参照とループ変数を明確に分離し、不要なインスタンス保持を避けることで、数万フォルダ規模の階層であっても安定して動作する。
—
応用:データベースやログ連携への拡張アプローチ
このスケルトン生成ツールを単なる「ファイルサーバの掃除道具」で終わらせるのはもったいない。実務では、これを基点として以下のような拡張連携が可能だ。
- 監査ログのDB格納: `processedCount` やエラーパスをテキストではなく、ADO(ActiveX Data Objects)経由でSQL ServerやSQLiteに直接インサートし、「どのフォルダがいつ、どの権限で作られたか」のメタデータ台帳を自動生成する。
- アクセス権(ACL)のクローニング: フォルダ構造をコピーした直後、Windows標準の `icacls` コマンドを `WScript.Shell` 経由で呼び出し、親フォルダのセキュリティ属性をスケルトン側へ伝播させる。
総括
VBScriptは「古い言語」とやゆされることがある。しかし、OSの深部に直接アプローチでき、追加のランタイムインストールすら不要で即座にインフラタスクを自動化できるこの軽量さは、現代のDevOpsシーンにおいても圧倒的な武器となる。
巨大なデータ構造に怯えるな。FSOの特性を正しく理解し、洗練されたアルゴリズムで「骨組み」だけを華麗に抽出せよ。あなたの業務自動化スクリプトは、今日から一段上のステージへとシフトする。
