PowerShell で空のフォルダーを削除する
この記事では、PowerShell で空のフォルダーを削除する方法を示します。
PowerShell のGet-ChildItem
コマンドレット
Get-ChildItem
コマンドレットは、指定された場所のすべての子項目 (ファイルとフォルダー) を取得します。 特定のフォルダー パス内のすべての空のフォルダーを削除する必要がある場合は、フォルダー階層をトラバースする必要があります。
したがって、Get-ChildItem
コマンドレットが役立ちます。 このコマンドレットは、Recurse
や Directory
などのパラメーターを受け入れて、ディレクトリ タイプの子アイテムをフェッチし、フォルダー構造を再帰的にトラバースします。
構文:
Get-ChildItem -Path -Directory -Recurse
使用できるオプションのパラメーターは他にも多数あります。 以下に示すようなフォルダ構造を作成しましょう。
somepath/testA
testB
testD
testE
a.txt
testC
testF
b.txt
testG
testH
目的は、testA
フォルダー内のすべての空のフォルダーを削除することです。 そのため、以下のフォルダを削除する必要があります。
テストD
テストG
テストH
指定されたフォルダー パス (somepath/testA
) 内のすべてのサブディレクトリを取得してみましょう。
$path = "D:\testA"
$fetchedDirList = Get-ChildItem $path -directory -recurse
Get-ChildItem
の代わりに gci
エイリアスを使用することも可能です。
$fetchedDirList = gci $path -directory -recurse
$fetchedDirList
変数を確認してみましょう。
$fetchedDirList
出力:
すべてのディレクトリとサブディレクトリが期待どおりに取得されました。
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
出力:
結果は完全に正しいです。 testD
と testH
という 2つのフォルダーだけがあり、コンテンツは空です。
$emptyDirectoryList
コレクションから各オブジェクトを簡単に削除できます。 Remove-Item
コマンドレットを使用してアイテムを削除できます。
その前に、$emptyDirectoryList
内の各オブジェクトのフル パスを取得する必要があります。 Select-Object
コマンドレットは、FullName
プロパティを使用してオブジェクトを取得できます。
$finalListToRemove = $emptyDirectoryList | select -expandproperty FullName
$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 }
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.