So löschen Sie leere Ordner in PowerShell
-
Cmdlet
Get-ChildItem
in PowerShell -
Cmdlet
Where-Object
in PowerShell - Elemente aus einer Sammlung in PowerShell löschen
- Fazit

Eine effektive Verzeichnisverwaltung ist in PowerShell-Skripten unerlässlich, und das Cmdlet Get-ChildItem
dient als Grundpfeiler für die Navigation in Dateisystemen. Bei der Aufgabe, leere Ordner zu bereinigen, wird das Durchlaufen von Ordnerhierarchien entscheidend.
Dieser Artikel beleuchtet die praktische Verwendung von Get-ChildItem
zusammen mit anderen Cmdlets, um systematisch leere Verzeichnisse innerhalb spezifischer Pfade zu identifizieren und zu entfernen. Durch die Nutzung der leistungsstarken Skriptingfähigkeiten von PowerShell können Benutzer Verzeichnisse effizient verwalten und ein gut organisiertes Dateisystem sicherstellen.
Cmdlet Get-ChildItem
in PowerShell
Das Cmdlet Get-ChildItem
ruft alle untergeordneten Elemente (Dateien und Ordner) für einen angegebenen Standort ab. Wenn es notwendig ist, alle leeren Ordner in einem bestimmten Ordnerpfad zu löschen, ist es unerlässlich, die Ordnerhierarchie zu durchlaufen.
Daher wäre das Cmdlet Get-ChildItem
hilfreich. Dieses Cmdlet akzeptiert Parameter wie Recurse
und Directory
, um unterverzeichnisartige Elemente 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 sie im Folgenden dargestellt ist.
somepath/testA
testB
testD
testE
a.txt
testC
testF
b.txt
testG
testH
Ziel ist es, alle leeren Ordner innerhalb des Ordners 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
In diesem Snippet weisen wir der Variablen $path
den Verzeichnispfad "D:\testA"
zu und verwenden das Cmdlet Get-ChildItem
mit den Parametern -Directory
und -Recurse
, um alle Verzeichnisse rekursiv aus dem angegebenen Pfad abzurufen. Die resultierende Liste der Verzeichnisse wird in der Variablen $fetchedDirList
gespeichert, was uns eine Sammlung von Verzeichnisobjekten gibt, die alle Verzeichnisse innerhalb von "D:\testA"
und seinen Unterverzeichnissen darstellen.
Es ist möglich, das Alias gci
anstelle von Get-ChildItem
zu verwenden.
$fetchedDirList = gci $path -directory -Recurse
Beim Übergang vom ursprünglichen Code zu dieser überarbeiteten Version erfassen wir weiterhin die Verzeichnisobjekte, die mit dem Cmdlet Get-ChildItem
abgerufen werden, in der Variablen $fetchedDirList
. In diesem aktualisierten Code verwenden wir jedoch das Alias gci
anstelle des vollständigen Cmdlet-Namens Get-ChildItem
.
Dieser Kurzschluss bewahrt die Funktionalität, Verzeichnisse rekursiv aus dem angegebenen Pfad $path
abzurufen und sie in $fetchedDirList
zu speichern.
Lassen Sie uns die Variable $fetchedDirList
überprüfen.
$fetchedDirList
Ausgabe:
Alle Verzeichnisse und Unterverzeichnisse wurden wie erwartet abgerufen.
Cmdlet Where-Object
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.
Das Alias Where
kann anstelle des Befehls Where-Object
verwendet werden. Wir müssen die obige Verzeichnisliste basierend auf der Elementanzahl innerhalb jedes Verzeichnisses filtern.
Die Bedingung wird im Folgenden angezeigt.
where { (gci $_.fullName).count -eq 0 }
Wenn das gegebene 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 Schrittes an das Cmdlet Where
weiterleiten.
$emptyDirectoryList = $fetchedDirList | where { (gci $_.fullName).count -eq 0 }
In dieser Codezeile weisen wir der Variablen $emptyDirectoryList
das Ergebnis des Filterns von Verzeichnissen aus $fetchedDirList
unter Verwendung des Alias Where
zu. Die Filterbedingungen, die in einem Skriptblock definiert sind, überprüfen, ob die Anzahl der untergeordneten Elemente innerhalb jedes Verzeichnisses (abgerufen mit gci $_.FullName
) gleich 0 ist.
Dieser Ansatz identifiziert und erfasst effektiv nur die Verzeichnisobjekte, die in $emptyDirectoryList
leere Verzeichnisse darstellen.
Lassen Sie uns $emptyDirectoryList
ausgeben.
$emptyDirectoryList
Ausgabe:
Das Ergebnis ist vollkommen korrekt. Wir haben nur zwei Ordner mit den Namen testD
und testH
mit leerem Inhalt erhalten.
Wir können jedes Objekt aus der Sammlung $emptyDirectoryList
leicht löschen. Das Cmdlet Remove-Item
kann verwendet werden, um ein Element zu löschen.
Davor müssen wir den vollständigen Pfad jedes der Objekte, die sich in $emptyDirectoryList
befinden, abrufen. Das Cmdlet Select-Object
kann die Objekte mit seiner Eigenschaft FullName
abrufen.
$finalListToRemove = $emptyDirectoryList | select -ExpandProperty FullName
In dieser Codezeile erstellen wir eine neue Variable $finalListToRemove
, indem wir die vollständigen Pfade der Verzeichnisse, die in $emptyDirectoryList
gespeichert sind, extrahieren. Wir nutzen das Cmdlet Select-Object
mit dem Parameter -ExpandProperty FullName
, um den Wert der Eigenschaft FullName
für jedes Verzeichnisobjekt in $emptyDirectoryList
abzurufen.
Infolgedessen enthält $finalListToRemove
eine Liste von vollständigen Pfaden zu den leeren Verzeichnissen, die zur Löschung bereit sind.
$finalListToRemove
Ausgabe von $finalListToRemove
:
Jetzt haben wir die Liste der Ordner, die entfernt werden sollen.
Elemente aus einer Sammlung in PowerShell löschen
Es ist möglich, das Cmdlet ForEach-Object
zu verwenden, um durch die Elemente in einer Sammlung zu iterieren. Innerhalb der Schleife können wir das Cmdlet Remove-Item
verwenden.
$finalListToRemove | ForEach-Object { Remove-Item $_ }
Das $_
steht für das aktuelle Element in der Sammlung. Dies wird die Ordner testD
und testH
löschen.
Es gibt hier einen kniffligen Teil. Wenn der Ordner testH
gelöscht wird, wird auch das Verzeichnis testG
leer.
Daher müssen wir das Skript ein wenig anpassen. Wir sollten das oben genannte Verfahren so lange ausführen, bis wir keine leeren Ordner mehr haben.
Wir können die Schleife do...while
verwenden, um dies zu erreichen.
$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 )
In diesem Codeblock richten wir eine Schleife ein, um systematisch leere Verzeichnisse innerhalb des angegebenen Pfades und seiner Unterverzeichnisse zu erkennen und zu löschen. Innerhalb der Schleife verwenden wir zuerst das Cmdlet Get-ChildItem
, um alle Verzeichnisse rekursiv aus dem angegebenen Pfad abzurufen.
Anschließend filtern wir die leeren Verzeichnisse mit dem Cmdlet Where-Object
heraus. Nachdem wir die vollständigen Pfade dieser leeren Verzeichnisse extrahiert haben, fahren wir fort, sie einzeln mit dem Cmdlet Remove-Item
innerhalb einer ForEach-Object
-Schleife zu entfernen.
Diese Schleife wird solange fortgesetzt, bis keine leeren Verzeichnisse mehr vorhanden sind, die gelöscht werden müssen, was eine gründliche Bereinigung der leeren Verzeichnisse innerhalb des angegebenen Pfades und seiner Unterverzeichnisse gewährleistet.
Wenn Sie versteckte Dateien und Ordner berücksichtigen müssen, können wir das -Force
-Parameter an das Cmdlet Get-ChildItem
übergeben, wie im Folgenden gezeigt.
$emptyDirectoryList = $fetchedDirList | where { (gci $_.fullName -Force).count -eq 0 }
Ausgabe:
Fazit
In PowerShell ist es wichtig, leere Ordner effizient zu identifizieren und zu entfernen, um ein organisiertes Dateisystem aufrechtzuerhalten. Durch die strategische Nutzung von Cmdlets wie Get-ChildItem
, Where-Object
und Remove-Item
können Benutzer die Aufgaben der Verzeichnisverwaltung optimieren.
Diese Cmdlets ermöglichen eine umfassende Bereinigung von Verzeichnissen innerhalb spezifischer Pfade, wodurch die Systemeffizienz und -organisation verbessert wird. Durch die Nutzung der Skriptumgebung von PowerShell können Benutzer die Prozesse der Verzeichnisverwaltung automatisieren, Zeit und Mühe sparen und gleichzeitig ein aufgeräumtes Dateisystem gewährleisten.
Mit den robusten Fähigkeiten von PowerShell wird die Verzeichnisverwaltung zu einem nahtlosen Aspekt der Systemadministration, der es den Benutzern ermöglicht, eine optimale Systemleistung aufrechtzuerhalten.
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.