PowerShell: Leere Ordner löschen
Das Löschen eines Ordners kann mit dem PowerShell Befehl Remove-Item -Path "C:\Test1\"
durchgeführt werden. Möchte man aber in einer komplexen Ordnerstruktur nur die leeren Ordner löschen, so wird der Befehl etwas komplexer. Doch was macht das Script komplexer? Beispielsweise die Unterordner, und dessen Unterordner
Zuerst muss das gewünschte Verzeichnis rekursiv ausgelesen werden. Danach muss überprüft werden, ob das ausgelesene Objekt ein Ordner ist. Wenn ja, muss zusätzlich überprüft werden, ob der Ordner leer ist, also keine Dateien oder weitere Unterordner enthält. Wenn diese Prozedur durchlaufen ist, kann der Ordner mit dem PowerShell Cmdlet Remove-Item gelöscht werden
PowerShell: nur leere Ordner löschen
Um nun nur leere Ordner eines komplexen Verzeichnisses zu löschen, muss folgende Prozedur in PowerShell durchlaufen werden:
- Verzeichnis rekursiv auslesen
- Prüfen, ob Element ein Ordner und leer ist
- Leeren Ordner löschen
# Root-Verzeichnis, welches durchlaufen werden soll $rootPath = "C:\Users\huberj\Desktop\Test\" # Alle Elemente im Root-Verzeichnis REKURSIV auslesen foreach($childItem in (Get-ChildItem $rootPath -Recurse)) { # wenn es sich um einen Ordner handelt UND dieser leer ist if( ($childItem.PSIsContainer) -and (!(Get-ChildItem -Recurse -Path $childItem.FullName))) { # leeren Ordner löschen Remove-Item $childItem.FullName -Confirm:$false } }
Vor allem das rekursive Durchlaufen ist wichtig. Rekursiv bedeutet, dass nicht nur so genannte Top-Level Ordner und Dateien ausgelesen werden, sondern auch Unterordner und dessen Unterordner. Hierfür wird der Parameter -Recurse
verwendet. Somit ist gewährleistet, dass das ganze Verzeichnis mit PowerShell durchlaufen wird. Außerdem wird jeder Unterordner wiederum überprüft, damit wirklich nur leere Ordner gelöscht werden.
Da es auch Dateien gibt, welche keine Dateiendung besitzen, können Dateien auch mit Ordnern verwechselt werden. Damit aber nur die Ordner ausgelesen werden, wird .PSIsContainer
verwendet. Außerdem wird dann versucht Dateien auszulesen. Werden keine Dateien ausgelesen (!
), handelt es sich um einen leeren Ordner, der gelöscht werden kann.
Das eigentliche Löschen der einzelnen Verzeichnisse übernimmt dann das PowerShell Cmdlet Remove-Item mit dem Parameter -Confirm:$false
. Dieser Parameter bewirkt, dass vor dem Löschen des Ordners nicht gefragt wird, sondern die Aktion direkt durchgeführt wird. Mit -Confirm:$true
muss man jedes Löschen bestätigen, was in sensiblen Verzeichnissen durchaus zur Anwendung kommen kann.