Löschen Sie leere Ordner in PowerShell
-
Get-ChildItem
-Cmdlet in PowerShell -
Where-Object
-Cmdlet in PowerShell - Elemente aus einer Sammlung in PowerShell löschen
Dieser Artikel zeigt Möglichkeiten zum Löschen leerer Ordner in PowerShell.
Get-ChildItem
-Cmdlet in PowerShell
Das Cmdlet Get-ChildItem
ruft alle untergeordneten Elemente (Dateien und Ordner) für einen bestimmten Speicherort ab. Wenn alle leeren Ordner in einem bestimmten Ordnerpfad gelöscht werden müssen, muss die Ordnerhierarchie durchlaufen werden.
Daher wäre das Cmdlet Get-ChildItem
hilfreich. Dieses Cmdlet akzeptiert Parameter wie Recurse
und Directory
, um untergeordnete Elemente vom Typ Verzeichnis abzurufen und die Ordnerstruktur rekursiv zu durchlaufen.
Syntax:
Get-ChildItem -Path -Directory -Recurse
Es stehen viele weitere optionale Parameter zur Verfügung. Lassen Sie uns eine Ordnerstruktur erstellen, wie im Folgenden gezeigt.
somepath/testA
testB
testD
testE
a.txt
testC
testF
b.txt
testG
testH
Der Zweck besteht darin, alle leeren Ordner im Ordner testA
zu entfernen. Daher sollten die folgenden Ordner gelöscht werden.
testD
testG
testH
Lassen Sie uns alle Unterverzeichnisse im angegebenen Ordnerpfad (somepath/testA
) abrufen.
$path = "D:\testA"
$fetchedDirList = Get-ChildItem $path -directory -recurse
Die Verwendung des Alias gci
statt Get-ChildItem
ist möglich.
$fetchedDirList = gci $path -directory -recurse
Lassen Sie uns die Variable $fetchedDirList
überprüfen.
$fetchedDirList
Ausgang:
Alle Verzeichnisse und Unterverzeichnisse wurden wie erwartet abgerufen.
Where-Object
-Cmdlet in PowerShell
Wir müssen die leeren Verzeichnisse aus dem obigen Ergebnis herausfiltern. Das Cmdlet Where-Object
filtert Objekte aus einer Sammlung basierend auf ihren Eigenschaften.
Der Alias Where
kann anstelle des Befehls Where-Object
verwendet werden. Wir müssen die obige Verzeichnisliste basierend auf der Elementanzahl in jedem Verzeichnis filtern.
Der Zustand ist im Folgenden dargestellt.
Where { (gci $_.fullName).count -eq 0 }
Wenn das angegebene Objekt aus der Sammlung 0 Unterelemente hat, wird es als leeres Verzeichnis betrachtet. Daher sollten wir es löschen.
Lassen Sie uns die Ausgabe des vorherigen Schritts an das Cmdlet Where
weiterleiten.
$emptyDirectoryList = $fetchedDirList | Where { (gci $_.fullName).count -eq 0 }
Lassen Sie uns die $emptyDirectoryList
drucken.
$emptyDirectoryList
Ausgang:
Das Ergebnis ist vollkommen korrekt. Wir haben nur zwei Ordner namens testD
und testH
mit leerem Inhalt.
Wir können jedes Objekt einfach aus der Sammlung $emptyDirectoryList
löschen. Mit dem Cmdlet Remove-Item
kann ein Item gelöscht werden.
Zuvor müssen wir den vollständigen Pfad jedes Objekts in der $emptyDirectoryList
abrufen. Das Cmdlet Select-Object
kann die Objekte mit seiner Eigenschaft FullName
abrufen.
$finalListToRemove = $emptyDirectoryList | select -expandproperty FullName
Ausgabe der $finalListToRemove
:
Jetzt haben wir die zu entfernende Ordnerliste.
Elemente aus einer Sammlung in PowerShell löschen
Es ist möglich, das Cmdlet ForEach-Object
zu verwenden, um die Elemente in einer Sammlung zu durchlaufen. Innerhalb der Schleife können wir das Cmdlet Remove-Item
verwenden.
$finalListToRemove | Foreach-Object { Remove-Item $_ }
Das $_
bezeichnet das aktuelle Element in der Sammlung. Dadurch werden die Ordner testD
und testH
gelöscht.
Hier gibt es einen kniffligen Teil. Wenn der Ordner testH
gelöscht wird, wird auch das Verzeichnis testG
leer.
Daher müssen wir das Skript ein wenig modifizieren. Wir sollten das obige Verfahren ausführen, bis nicht leere Ordner übrig bleiben.
Dazu können wir die do...while
-Schleife verwenden.
$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 )
Hier führen wir die while
-Schleife aus, bis die Anzahl der leeren Ordner 0 wird. Wenn Sie die versteckten Dateien und Ordner berücksichtigen müssen, können wir den -Force
-Parameter an das Get-ChildItem
-Cmdlet übergeben, wie in gezeigt die folgende.
$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.