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

leerer Ordner

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:

  1. Verzeichnis rekursiv auslesen
  2. Prüfen, ob Element ein Ordner und leer ist
  3. 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.

leere Ordner löschen mit PowerShell

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.

Johannes
 

Click Here to Leave a Comment Below 0 comments