Löschen Sie leere Ordner in PowerShell

Migel Hewage Nimesha 20 Juni 2023
  1. Get-ChildItem-Cmdlet in PowerShell
  2. Where-Object-Cmdlet in PowerShell
  3. Elemente aus einer Sammlung in PowerShell löschen
Löschen Sie leere Ordner in PowerShell

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.

  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

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:

Get-ChildItem

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:

Wo-Objekt

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:

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 }
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