こんにちは!業務自動化の現場を駆け抜けてきたエンジニアの先輩です。
日々の業務の中で、システムが自動生成した一時ファイルやログ出力用のフォルダが、役目を終えたあともゴーストタウンのように「空のフォルダ」としてハードディスクの片隅に残り続けている……そんな光景を見たことはありませんか?
「容量は大して食わないから放置してもいいか」と思いがちですが、いざフォルダを開こうとしたときに無数の空フォルダが階層状に残っていると、メンテナンス性が悪くなり、バックアップの処理時間やファイル検索のパフォーマンスにも悪影響を及ぼします。
今回は、VBScript(Visual Basic Scripting Edition)を使って、指定したルートフォルダの奥深くまで再帰的(ツリー構造の末端まで)に潜り込み、ファイルが1つも入っていない「本当の空フォルダ」だけを根こそぎ、かつ安全に掃除するメンテナンスツールの作り方を解説します。
ここをクリアすれば、FSO(ファイルシステムオブジェクト)を使った高度な階層走査の基本はバッチリですよ!一緒にマスターしていきましょう。
—
1. なぜ「空フォルダの削除」は一筋縄ではいかないのか?
まず、エンジニアとしての重要な知見を共有しておきます。
Windowsの標準コマンドや単純なスクリプトでフォルダを削除しようとしたとき、よくある失敗が「上位のフォルダから順番に消そうとしてエラーになる」という現象です。
フォルダ構造が以下のようなツリーになっているとします。
C:\Work\
└── 2023\
└── 12\
└── temp_logs\ (ファイルはゼロ)
もし、親である `2023` フォルダを先に消そうとすると、OSは「中にまだ `12` という子フォルダがあるから消せません!」と怒り(エラーを返し)ます。
解決の鍵:帰りの駄賃のような「ボトムアップ(再帰)処理」
この問題をスマートに解決するには、一番奥の末端(底辺)のフォルダまでまず到達し、そこから手前(上流)に向かって帰りがけに順番に消していくというアプローチが必要です。これがプログラミングにおける「再帰処理(Recursion)」の真髄です。
—
2. 実装コード:一括再帰削除メンテナンスツール
それでは、実際のVBScriptコードを公開します。
メモ帳などのテキストエディタに以下のコードを貼り付け、ファイル名を `CleanEmptyFolders.vbs` として保存してください(文字コードは `Shift-JIS` または `BOM付きUTF-8` を推奨します)。
‘ ==============================================================================
‘ ツール名: 空フォルダ一括再帰削除メンテナンスツール
‘ 概要: 指定されたパスを起点に、ファイルが存在しない空のフォルダを再帰的に削除します。
‘ 開発者: 業務自動化アーキテクト
‘ ==============================================================================
Option Explicit
Dim fso, targetPath, deletedCount
‘ オブジェクトのライフサイクル開始:FSOのインスタンス生成
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 【設定エリア】掃除対象のルートフォルダパスを指定してください
targetPath = “C:\Work\TestFolder”
‘ 対象パスが存在するかチェック
If fso.FolderExists(targetPath) Then
deletedCount = 0
WScript.Echo “【開始】 ‘” & targetPath & “‘ の空フォルダ検索・削除を開始します。”
‘ 再帰削除のコア関数を呼び出し
RemoveEmptyFolders fso.GetFolder(targetPath)
WScript.Echo “【完了】 処理が終了しました。合計 ” & deletedCount & ” 個の空フォルダを削除しました。”
Else
WScript.Echo “【エラー】 指定されたフォルダが存在しません: ” & targetPath
End If
‘ オブジェクトのライフサイクル終了:メモリ解放
Set fso = Nothing
WScript.Quit
‘ ==============================================================================
‘ 関数名: RemoveEmptyFolders
‘ 引数: objFolder (Folderオブジェクト)
‘ 概要: 子フォルダを先に再帰探索し、最終的に空になったフォルダを削除する中核関数
‘ ==============================================================================
Sub RemoveEmptyFolders(objFolder)
Dim subFolder
‘ 1. 【重要】まずは子供(サブフォルダ)たちを先に処理させる(ボトムアップの原則)
‘ ※ここでループを回すため、Collectionsのコピーを安全に処理します
For Each subFolder in objFolder.SubFolders
RemoveEmptyFolders subFolder
Next
‘ 2. 自分自身の状態をチェック(ルートフォルダそのものは、たとえ空でも削除対象外とする安全弁)
If objFolder.Path <> fso.GetAbsolutePathName(targetPath) Then
‘ 3. ファイルも子フォルダ(削除されずに残ったもの)も無いか判定
‘ ※SubFolders.Count と Files.Count の両方をチェックするのが確実です
If objFolder.SubFolders.Count = 0 And objFolder.Files.Count = 0 Then
WScript.Echo “削除実行: ” & objFolder.Path
On Error Resume Next
objFolder.Delete True ‘ 強制削除フラグ(True)を付与
If Err.Number = 0 Then
deletedCount = deletedCount + 1
Else
WScript.Echo ” -> 警告: 権限不足またはファイル競合のため削除できませんでした。”
Err.Clear
End If
On Error GoTo 0
End If
End If
End Sub
—
3. コードのポイントと知られざる「罠」の回避策
初心者からワンランク上のエンジニアへステップアップするために、このコードに込めた設計の極意を3つ解説します。
① `Option Explicit` による厳格な変数宣言
VBScriptでは省略可能な `Option Explicit` ですが、実務でこれを書かないのは「ブレーキの壊れたスポーツカーで山道を走る」ようなものです。変数名のタイポによるバグを未然に防ぐため、必ず先頭に記述するクセをつけましょう。
② コレクション走査時の「罠」を避けるボトムアップ
Subプロシージャ `RemoveEmptyFolders` の前半部分で、子フォルダのループを回しています。
ここでポイントなのは、「自分の子どもをいじる前に、子どもの子ども(さらに奥)を完全に処理し切る」という順序です。これにより、親フォルダを削除した後に子フォルダの参照が迷子になる、というメモリ上の致命的なバグを防いでいます。
③ `On Error Resume Next` による堅牢性(ロバスト性)
ファイルサーバーなどを掃除していると、運悪く他のプロセスがファイルを掴んでいたり、アクセス権限(ACL)が足りなくて `Delete` メソッドがエラーを吐くことがあります。
ここでスクリプト全体が「スクリプトエラーで強制終了」してはメンテナンスツール失格です。あえて一時的にエラーを無視 (`On Error Resume Next`) し、失敗したフォルダはスキップして次へ進むという「業務システムに求められるタフさ」を実装しています。
—
4. 実行してみよう
1. 上記のコードを `CleanEmptyFolders.vbs` として保存。
2. コード内の `targetPath = “C:\Work\TestFolder”` の部分をご自身の環境に合わせて書き換える(※テスト用の適当な空フォルダ構造を作って試すのが安全です)。
3. コマンドプロンプトから `cscript CleanEmptyFolders.vbs` と叩くか、エクスプローラーからファイルをダブルクリック(`wscript` で実行)します。
コンソール(またはポップアップ)に削除されたフォルダのパスが次々と表示され、処理が終わると「合計 ○個の空フォルダを削除しました」とスマートに報告してくれます。
—
おわりに
今回は、VBScriptとFSOを駆使した「空フォルダの再帰的クリーンアップツール」について解説しました。
一見地味な処理に見えますが、「再帰呼び出し」「コレクションの安全な走査」「エラーハンドリング」といった、あらゆるプログラミング言語に共通する極めて重要なエッセンスがぎっしり詰まっています。
このスクリプトをタスクスケジューラに登録しておけば、あなたのPCやサーバーの環境はいつでもピカピカに保たれます。日々の面倒な手作業をコードでスマートに自動化する快感、ぜひ味わってみてくださいね。それでは、次の自動化の現場でお会いしましょう!
