適材適所

システム屋のくらげが書いているブログです。PowerShellやVBAなどプログラミング系の話やシステム管理の気づきなどを書いています。

MENU

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

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

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

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

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

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

空フォルダを探すには、Get-ChildItemコマンドレット、

フォルダを削除するためには、Remove-Itemコマンドレットを使います。

この2つのコマンドレットを組み合わせることで目的を達成することができます。

この記事では、指定したフォルダ以下にあるフォルダを全部検索して

空フォルダであれば、削除する方法を紹介します。

では2つのコマンドレットについて、それぞれ見ていきましょう。

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

Get-ChildItemコマンドレットはファイルやフォルダを検索するときに使います。

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

対象のフォルダの中のファイルやフォルダ数を得るためには、

Get-ChildItemコマンドレットの結果の数を数えてあげます。

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

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

対象のフォルダが空フォルダの場合はこの値が0になるので、

この値が0なら空フォルダであると判断できます。

しかし、これだけでは指定した1つのフォルダが

空であるかどうかしか判断できません。

さらに指定したフォルダ以下のフォルダを再帰的に検索する必要があります。

フォルダを再帰的に検索する

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

Get-ChildItemコマンドレットの-Directoryスイッチを使います。

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

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

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

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

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スイッチを指定することで実際に削除は行わず、

何が起こるが確認することができます。

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スイッチを指定してください。

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

空フォルダの検索をまとめてひとつの関数にしてみました。

 
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 

終わりに

PCの中がちらかってきたら、ぜひ試してほしい、

PowerShellを使った空フォルダの削除の紹介でした。

しつこいようですが、Remove-Itemを使うときは、

くれぐれもご注意ください・・・。

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