PowerShell で空のフォルダーを削除する

Migel Hewage Nimesha 2023年6月20日
  1. PowerShell のGet-ChildItemコマンドレット
  2. PowerShell のWhere-Objectコマンドレット
  3. PowerShell でコレクションから項目を削除する
PowerShell で空のフォルダーを削除する

この記事では、PowerShell で空のフォルダーを削除する方法を示します。

PowerShell のGet-ChildItemコマンドレット

Get-ChildItem コマンドレットは、指定された場所のすべての子項目 (ファイルとフォルダー) を取得します。 特定のフォルダー パス内のすべての空のフォルダーを削除する必要がある場合は、フォルダー階層をトラバースする必要があります。

したがって、Get-ChildItem コマンドレットが役立ちます。 このコマンドレットは、RecurseDirectory などのパラメーターを受け入れて、ディレクトリ タイプの子アイテムをフェッチし、フォルダー構造を再帰的にトラバースします。

構文:

Get-ChildItem -Path -Directory -Recurse

使用できるオプションのパラメーターは他にも多数あります。 以下に示すようなフォルダ構造を作成しましょう。

somepath/testA
			testB
				testD
				testE
					a.txt
			testC
				testF
					b.txt
				testG
					testH

目的は、testA フォルダー内のすべての空のフォルダーを削除することです。 そのため、以下のフォルダを削除する必要があります。

  1. テストD
  2. テストG
  3. テストH

指定されたフォルダー パス (somepath/testA) 内のすべてのサブディレクトリを取得してみましょう。

$path = "D:\testA"
$fetchedDirList = Get-ChildItem $path -directory -recurse

Get-ChildItem の代わりに gci エイリアスを使用することも可能です。

$fetchedDirList = gci $path -directory -recurse

$fetchedDirList 変数を確認してみましょう。

$fetchedDirList

出力:

Get-ChildItem

すべてのディレクトリとサブディレクトリが期待どおりに取得されました。

PowerShell のWhere-Objectコマンドレット

上記の結果から空のディレクトリを除外する必要があります。 Where-Object コマンドレットは、プロパティに基づいてコレクションからオブジェクトをフィルター処理します。

Where-Object コマンドの代わりに Where エイリアスを使用できます。 各ディレクトリ内の項目数に基づいて、上記のディレクトリ リストをフィルタリングする必要があります。

以下に条件を示します。

Where { (gci $_.fullName).count -eq 0 }

コレクションの特定のオブジェクトにサブアイテムがない場合、空のディレクトリと見なされます。 したがって、削除する必要があります。

前のステップの出力を Where コマンドレットにパイプしましょう。

$emptyDirectoryList = $fetchedDirList | Where { (gci $_.fullName).count -eq 0 }

$emptyDirectoryList を印刷しましょう。

$emptyDirectoryList

出力:

Where-Object

結果は完全に正しいです。 testDtestH という 2つのフォルダーだけがあり、コンテンツは空です。

$emptyDirectoryList コレクションから各オブジェクトを簡単に削除できます。 Remove-Item コマンドレットを使用してアイテムを削除できます。

その前に、$emptyDirectoryList 内の各オブジェクトのフル パスを取得する必要があります。 Select-Object コマンドレットは、FullName プロパティを使用してオブジェクトを取得できます。

$finalListToRemove = $emptyDirectoryList | select -expandproperty FullName

$finalListToRemove の出力:

finalListToRemove

これで、フォルダ リストが削除されました。

PowerShell でコレクションから項目を削除する

ForEach-Object コマンドレットを使用して、コレクション内の項目をループすることができます。 ループ内では、Remove-Item コマンドレットを使用できます。

$finalListToRemove | Foreach-Object { Remove-Item $_ }

$_ は、コレクション内の現在のアイテムを示します。 これにより、testD および testH フォルダーが削除されます。

ここにはトリッキーな部分があります。 testH フォルダを削除すると、testG ディレクトリも空になります。

したがって、スクリプトを少し変更する必要があります。 空でないフォルダが残るまで、上記の手順を実行する必要があります。

do...while ループを使用してそれを行うことができます。

$path = "D:\testA"
do{
$fetchedDirList = Get-ChildItem $path -directory -recurse
$emptyDirectoryList = $fetchedDirList | Where { (gci $_.fullName).count -eq 0 }
$finalListToRemove = $emptyDirectoryList | select -expandproperty FullName
$finalListToRemove | Foreach-Object { Remove-Item $_ }
} while ( $finalListToRemove.count -gt 0 )

ここでは、空のフォルダーのリスト数が 0 になるまで while ループを実行します。隠しファイルとフォルダーを考慮する必要がある場合は、-Force パラメーターを Get-ChildItem コマンドレットに渡すことができます。 以下。

$emptyDirectoryList = $fetchedDirList | Where { (gci $_.fullName -Force).count -eq 0 }
Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.

関連記事 - PowerShell Folder