空フォルダを一括削除するPowerShellスクリプト

Windows10の小技
geralt / Pixabay

こんばんわ。不可思議絵の具(Twitter)です。

私儀都合(エチチ画像整理)のため、空フォルダを一括削除するPowerShellスクリプトを作りました。

指定フォルダ以下を全て辿り中身が空っぽのフォルダを片っ端から削除します。

 

「片っ端から」は↓こんな動きです。

  • C:\A (親)
    • C:\A\1 (子)
      • C:\A\1\x (孫)

たとえばこんな構造のフォルダがあったとき。
\は¥記号で読み替えて下さい)

  • C:\A」▶「C:\A\1」▶「C:\A\1\x」と中身を辿っていった結果、
    これらの中身が全てカラだったら、
    C:\A」「C:\A\1」「C:\A\1\x」を全て削除します。
  • C:\A\1」に何かファイルがある場合は「C:\A\1\x」だけ削除します。

 

完全に自分用なので安全対策処理はおろか、エラー処理も無い危険な代物ですが、「シンプルで素直な作りなのでPowerShellスクリプトのたたき台に良いかな?」と思ったので公開します。

一応、約1.8万ファイル・約2,700フォルダ・約13GB分の虎の子エチチ画像命を懸けてテストしたので、おおかた大丈夫でしょうw

 

くどいですが自分用で、内容についてお問い合わせ頂いてもお答えはできませんし、詳細に解説する気もありません
(バグ報告は歓迎です)

あくまで、

  • 自分で読めて
  • 自分で意味を理解して
  • 自力で実行できる

「プログラマーの方」に向けて公開しております。

この後の文章も、そういった方に向けて遠慮無く書いておりますのでご了承ください。

スポンサーリンク
スポンサーリンク

サンプルスクリプト

下記テキストを「【任意の名前】.ps1」として保存してください。

#削除対象フォルダ(ここから下の空フォルダを削除する)
$TARGET_ROOT = "E:\Share\LocalSync\壁紙"

#除外ファイル(これらファイルは存在しないものとみなす)
$EXCLUDES = @("Thumbs.db", ".nomedia", "_filemany.simDB")


Write-Host "`n----- 開始 -----" -ForegroundColor Green

#並びを逆にする = フォルダの深い順に並べ替える
$targets = Get-ChildItem -Path $TARGET_ROOT -Directory -Recurse | Sort-Object -Descending

foreach ($target in $targets) {
    #除外ファイル以外のファイル数が0なら削除
    $items = Get-ChildItem -Path $target -Exclude $EXCLUDES -Recurse
    if ($items.Count -eq 0) {
        Write-Host "Delete: $target"
        Remove-Item $target -Recurse -Force     #Forceで隠しファイルもろとも削除
    }
}

Write-Host "----- 終了 -----" -ForegroundColor Green

使い方

動作概要

  1. $TARGET_ROOTに指定されたフォルダを起点に、全ての空フォルダを再帰的に削除します。
  2. このとき、$EXCLUDESに含まれたファイルは「存在しない物」としてみなします。
    (これらのファイルが存在していてもフォルダを削除する)
  3. また、$EXCLUDESが「隠しファイル」や「システムファイル」であっても無視します。
    Remove-Item-Recurse オプション)

設定

項番項目内容
1$TARGET_ROOT削除対象フォルダ。
このフォルダ以下の空フォルダを再帰的に削除します。
「C:\」など、ドライブ指定は危険なので避けましょう
2$EXCLUDES除外ファイル。
ドットファイルやThumbs.dbなど、フォルダもろとも削除して良いファイルを配列形式で指定します。

この2項目を設定した後、スクリプトを実行します。

簡易解説

コテコテの順次実行

私自身PowerShell初心者なので、パイプを極力使わない、コテコテな構造型言語の処理フローになっています。

やってることは

  1. 処理対象フォルダの列挙
  2. それらのファイル数を確認しながら、ゼロなら削除

これだけです。

Where-ObjectSelect-Object を駆使する上級者のコードに比べ、かなり取っつきやすいのではないでしょうか。

再帰処理もどき

動作概要で「再帰的に削除」と書きましたが、実際は再帰的に処理していません。

Sort-Object -Descending

としてフォルダ一覧の並び順を逆にすることで、結果的に「深いフォルダ」から順に削除される形になっています。

試験実行するときは

Remove-Item $target -Recurse -Force

をコメントアウトし、

Write-Host $target

とすると事前に対象フォルダを確認できます。

ただ、実際の削除が行われないため、「再帰的な削除」は確認できません。

さいごに

以上、空フォルダを一括削除するPowerShellスクリプトの紹介でした。

反応が良ければWindowsアプリにしようかな?

では(^o^)/

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