適材適所

PowerShellを中心にプログラミングやシステム管理の備忘録的なブログ

【PowerShell】空フォルダを削除する【Get-ChildItem】

パソコンの中がフォルダやファイルがちらかってきた・・・。

うん?よく見ると、中身が空っぽのフォルダがいるようだ・・・。

そんなやつらをいちいち探し出すのは面倒だ。

そんなときは、PowerShellを使って探し出し、削除しましょう。

空フォルダを探して、削除する

空フォルダを探すには、Get-ChildItemコマンドレット、フォルダを削除するためには、Remove-Itemコマンドレットを使います。この2つのコマンドレットを組み合わせることで目的を達成することができます。

この記事では、Get-ChildItemコマンドレットとRemove-Itemコマンドレットを組み合わせて空フォルダを探し出し、削除する方法を紹介します。

空フォルダを探すときはGet-ChildItemコマンドレットを使う

Get-ChildItemコマンドレットはファイルやフォルダ操作にかかせないコマンドレットの一つです。

様々な条件を指定してファイルやフォルダを検索し、情報を得ることができます。

フォルダの中のファイルやフォルダ数を得る

空フォルダかどうか判定するためには、対象のフォルダの中のファイルやフォルダ数を数えれば簡単にわかります。Get-ChildItemコマンドレットを使えばフォルダ内のファイルやフォルダの数を容易に知ることができます。

例えば、Cドライブ直下のファイルやフォルダ数を調べるためには、次のようにします。

 
(Get-ChildItem -path 'C:\' ).Count

対象のフォルダが空フォルダの場合はこの値が0になるので、この値が0なら空フォルダであると判断できます。

これで「1つのフォルダが空であるかどうか」がわかりました。今回はさらに便利にするために、さらに指定したフォルダより下層のフォルダについても再帰的に調べるようにします。

指定したフォルダ以下の空フォルダを再帰的に検索する

指定したフォルダ以下のフォルダを再帰的に検索するには、Get-ChildItemコマンドレットの-Recurseスイッチを使います。

次のようにすることで、フォルダだけを検索することができます。

 
Get-ChildItem -path 'C:\' -Recurse

試しに上記コマンドを実行してみるとわかるのですが、これだとフォルダだけでなく、ファイルも検索されてしまいます。そういうときは、-Directoryスイッチを使うことでフォルダだけを検索することが可能になります。

 
Get-ChildItem -path 'C:\' -Recurse -Directory

指定したフォルダ以下の空フォルダを再帰的に検索する

さて、-Recurse と-Directoryという2つのスイッチを使うことで再帰的にフォルダを検索することができるようになりました。これらを応用すれば空フォルダを再帰的に検索することができます。

少し回りくどいですが、2つのGet-ChildItemコマンドレットを組み合わせて実装してみました。次の例では、Cドライブ全体の空フォルダを再帰的に検索します。

 
$items=Get-ChildItem -Recurse -Path 'C:\' -Directory
foreach($item in $items)
{
   if((Get-ChildItem $item.fullname).Count -eq 0)
   {
      $item
    }
}

これで空フォルダを抽出することができました。次にフォルダを消す方法について見ていきましょう。

Remove-Itemコマンドレットでいらないフォルダを削除する

Remove-Itemコマンドレットはその名の通り、アイテムを削除します。このコマンドレットは色々なものを削除することができます。もちろんフォルダを指定することでフォルダを削除するとができます。

使い方は簡単です。Cドライブ直下にある「test」という名前のフォルダを削除する例です。

 
Remove-Item C:\test

このコマンドレット、あまりにも簡単にしれっと削除処理をしてしまうので、使うときは十分に注意が必要です。

不安な時や、試しに実行する際は、-WhatIfスイッチを指定することで実際に削除は行わず、何が起こるが確認することができます。というか最初は必ず-WhatIfスイッチで確認した方が良いです。予期せぬ事故を防げます。

f:id:shinmai_papa:20211219171833p:plain

これで、空フォルダを検索する方法とフォルダを削除する方法が出揃いました。後はこの二つを組み合わせてやることで空フォルダを削除することができます。

空フォルダを削除する

最後は、これらの2つを組み合わせます。

 
$StartPath='検索を開始するフォルダを指定する'
$items=Get-ChildItem -Recurse -Path $StartPath -Directory
foreach($item in $items)
{
   if((Get-ChildItem $item.fullname).Count -eq 0)
   {
      $item|Remove-Item #-WhatIf
    }
 }

これで、指定したフォルダ以下の空フォルダを探し出し、

削除することができます。

初めてやるときは、-WhatIfスイッチを指定して、自分の削除したいフォルダがちゃんと削除対象になっているか確認してください。いきなりやると、予想だにしなかったフォルダを誤って消してしまうことがあります(しつこいようですが・・・)。

空フォルダの検索を関数にまとめる

空フォルダの検索をいちいち書くのは面倒なので、まとめてひとつの関数にしてPROFILEに登録しておくと楽です。例えば私はこんな風にまとめてみました。

 
function Get-BlankDirectory{
[CmdletBinding()]
param([Parameter(Position = 0)]
      [ValidateScript({(Test-Path $_)})]
      $StartPath = '.\')
  begin{}
  process
  {
      $items=Get-ChildItem -Recurse -Path $StartPath -Directory
      foreach($item in $items)
      {
        if((Get-ChildItem $item.fullname).Count -eq 0)
        {
            $item
        }
      }
 }
  end{}
}

この関数とRemove-Itemを組み合わせることで何をやっているのかが一目でわかります。例えばCドライブ直下の空フォルダを削除したいときはこんな風に書くことができます。

 
Get-BlankDirectory -StartPath C:\|Remove-Item 

PowerShellに限らずシェル系は使い捨てになってしまうことも多いですが、可読性がいいことに越したことはないですからね。たまには気を使ってみました。

終わりに

PCの中がちらかってきたら、ぜひ試してほしい、PowerShellを使った空フォルダの削除の紹介でした。

しつこいようですが、Remove-Itemを使うときは、くれぐれもご注意ください・・・。

というわけで、ここまでお読みいただき、ありがとうございました。