【実務・中級編】【スケルトン構造複製】実ファイルはコピーせずフォルダの階層構造(ディレクトリツリー)のみを一括再現するツール – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

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の特性を正しく理解し、洗練されたアルゴリズムで「骨組み」だけを華麗に抽出せよ。あなたの業務自動化スクリプトは、今日から一段上のステージへとシフトする。

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