So löschen Sie leere Ordner in PowerShell

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

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.

  1. testD
  2. testG
  3. 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:

Get-ChildItem

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:

Wo-Objekt

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:

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:

PowerShell leere Ordner löschen - 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.

Genießen Sie unsere Tutorials? Abonnieren Sie DelftStack auf YouTube, um uns bei der Erstellung weiterer hochwertiger Videoanleitungen zu unterstützen. Abonnieren
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.

Verwandter Artikel - PowerShell Folder