Automatische Ordnerbereinigung
Zweck des Skripts
Dieses PowerShell-Skript dient zur automatisierten Bereinigung eines lokalen Verzeichnisses. Es entfernt:
-
alle Dateien, die älter als ein definierter Stichtag sind,
-
anschließend alle dadurch leer gewordenen Ordner (rekursiv),
-
und erstellt abschließend einen Auswertungsbericht über die vorgenommenen Löschvorgänge.
Einsatzszenario
Das Skript ist besonders sinnvoll für:
-
temporäre Datenablagen,
-
Projekt- oder Backup-Verzeichnisse mit regelmäßiger Datenrotation,
-
langfristig gewachsene Ordnerstrukturen mit veralteten Inhalten.
Beispiel: Entfernen von Dateien, die vor dem 01.01.2020 zuletzt bearbeitet wurden, aus C:\Test.
Voraussetzungen
-
PowerShell 5.1 oder höher
-
Schreib-/Lesezugriff auf das Zielverzeichnis und den Auswertungsordner
-
Ausreichende Rechte zum Löschen von Dateien und Ordnern
# Pfad des Hauptordners
$mainFolder = "C:\Test"
# Pfad für die Auswertungsdatei
$reportFolder = "C:\Auswertung"
$reportFile = Join-Path -Path $reportFolder -ChildPath "Auswertung_$(Get-Date -Format yyyyMMdd_HHmmss).txt"
# Stichtag für die Prüfung
$cutoffDate = Get-Date -Year 2020 -Month 1 -Day 1
# Statistiken für die Auswertung
$deletedFilesCount = 0
$deletedFoldersCount = 0
$retainedFoldersCount = 0
# Prüfen, ob der Auswertungsordner existiert, ansonsten erstellen
if (-not (Test-Path -Path $reportFolder)) {
New-Item -ItemType Directory -Path $reportFolder | Out-Null
}
# Funktion zum Rekursiven Löschen von Dateien und leeren Ordnern
function Cleanup-Folder {
param (
[string]$FolderPath
)
# Alle Dateien im aktuellen Ordner abrufen
$files = Get-ChildItem -Path $FolderPath -File
# Dateien löschen, die älter als der Stichtag sind
foreach ($file in $files) {
if ($file.LastWriteTime -lt $cutoffDate) {
Write-Host "Lösche Datei: $($file.FullName)" -ForegroundColor Red
Remove-Item -Path $file.FullName -Force
$global:deletedFilesCount++
}
}
# Alle Unterordner abrufen
$subfolders = Get-ChildItem -Path $FolderPath -Directory
foreach ($subfolder in $subfolders) {
# Rekursiv auf Unterordner anwenden
Cleanup-Folder -FolderPath $subfolder.FullName
}
# Prüfen, ob der Ordner leer ist
if (-not (Get-ChildItem -Path $FolderPath -Recurse | Measure-Object).Count) {
Write-Host "Lösche leeren Ordner: $($FolderPath)" -ForegroundColor Yellow
Remove-Item -Path $FolderPath -Recurse -Force
$global:deletedFoldersCount++
} else {
Write-Host "Behalte Ordner: $($FolderPath) - Enthält noch Inhalte" -ForegroundColor Green
$global:retainedFoldersCount++
}
}
# Hauptordner bereinigen
Cleanup-Folder -FolderPath $mainFolder
# Bericht erstellen
$reportContent = @"
Auswertung der Bereinigung
===========================
Hauptordner: $mainFolder
Stichtag: $($cutoffDate.ToShortDateString())
Gelöschte Dateien: $deletedFilesCount
Gelöschte Ordner: $deletedFoldersCount
Behaltene Ordner: $retainedFoldersCount
Bericht erstellt am: $(Get-Date -Format "dd.MM.yyyy HH:mm:ss")
"@
# Bericht speichern
Set-Content -Path $reportFile -Value $reportContent -Encoding UTF8
Write-Host "Bereinigung abgeschlossen! Bericht gespeichert unter: $reportFile" -ForegroundColor Green