Skip to main content

Neue Seite

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