Leere Ordner löschen – ganz einfach mit der Windows PowerShell

Der Dotnet-Doktor  –  7 Kommentare
Anzeige

Mit einem PowerShell-Skript kann man in einem Dateisystempfad rekursiv nach leeren Verzeichnissen suchen und diese löschen.

Im Dateisystem kommt es immer mal wieder zu leeren Verzeichnissen – entweder weil man diese versehentlich angelegt hat oder sie inzwischen keinen Inhalt mehr haben. Der Windows Explorer hat zur Suche nach leeren Ordnern keine eingebaute Funktion. Es gibt dafür spezielle Werkzeuge wie "Remove Empty Directories" von Jones John. Wer für diese Aufgabe aber keine spezielle Software installieren will, kann das nachstehende PowerShell-Skript nutzen. Es entfernt alle leeren Dateisystemordner innerhalb des angegebenen Pfads. Dabei wird der Pfad rekursiv durchsucht. Der Parameter -force wird bei Get-Childitem (Alias: dir) eingesetzt, damit auch versteckte Dateien und Ordner erkannt werden und Ordner nicht gelöscht werden, wenn nur versteckte Elemente enthalten sind.

Anzeige

###########################################
# Löschen leerer Dateisystemordner in einem Pfad (rekursiv)
# (C) Dr. Holger Schwichtenberg, www.IT-Visions.de
###########################################

# Eingabedaten
$root = "t:\projekte-archiv"
$logfile = "c:\temp\Leere Ordner löschen LOG.txt"
[int] $AnzGelöschteOrdner= 0

function Remove-EmptyFolder($path)
{
$list = dir -literalpath $path -File -Force
$Dateien = $list.count
$subdirs = dir -literalpath $path -Directory -Force

foreach($subdir in $subdirs)
{
$Dateien = $Dateien + (Remove-EmptyFolder$subdir.fullname)
}
Write-verbose "$path : $Dateien"
if ($Dateien -eq0)
{
Write-host "==> Lösche leeren Ordner: $path"
rd -literalpath$path -Recurse-Force
$script:AnzGelöschteOrdner++
Add-Content-Path $logfile-value $path
}

return $Dateien
}

## Hauptprogramm
Write-Host "Suche nach leeren Ordner im Pfad $root"
$subdirs = dir $root -Directory -Force

foreach($subdir in $subdirs)
{
Remove-EmptyFolder $subdir.fullname | out-null
}
Write-Host "$AnzGelöschteOrdner Ordner gelöscht!"

Die gelöschten Pfade werden in einer Protokolldatei notiert. Diese könnte bei Bedarf später genutzt werden, um die Dateisystemordner wieder anzulegen. Dazu würde der folgende Einzeiler reichen.

Get-Content "t:\Leere Ordner löschen.txt" | where { $_ -ne $null } | foreach { md $_ -ErrorAction SilentlyContinue }

Der Parameter -ErrorAction wird auf SilentlyContinue gesetzt, da es sonst zu Fehlermeldungen kommt, wenn ein übergeordneter Ordner bereits existiert, weil er beim Anlegen eines Unterordners automatisch mit angelegt wurde.

Anzeige