Windows aufräumen und Speicherplatz zurückgewinnen

Minimalistisches Beitragsbild mit PowerShell-Logo und dem Text „PowerShell Windows Bereinigung“.

Mit der Zeit sammelt Windows immer mehr überflüssige Daten an. Dazu gehören temporäre Dateien, Update-Reste, Logs oder Dateien im Papierkorb. Das Ergebnis ist ein immer voller werdender Speicher, ein langsameres System und eine unübersichtliche Datenstruktur. Die integrierte Datenträgerbereinigung hilft zwar ein wenig, wirkt jedoch häufig nicht gründlich genug. Mit einem PowerShell-Skript lässt sich das System dagegen deutlich effizienter und flexibler bereinigen.

Warum ein PowerShell-Skript sinnvoll ist

Ein PowerShell-Skript kann Bereiche bereinigen, die Windows selbst oft ignoriert. Dazu gehören sowohl die temporären Dateien des Benutzers als auch des Systems, der Cache des Windows Update-Dienstes sowie der Komponentenstore, in dem Windows ältere Versionen von Systemdateien ablegt. Gemeinsam können diese Daten mehrere Gigabyte an Speicherplatz belegen.

Das Skript bietet ein einfaches Menü, das sich direkt in der PowerShell ISE bedienen lässt. So können selbst weniger erfahrene Anwender gezielt auswählen, welche Bereiche bereinigt werden sollen.

Hinweis zur Ausführung von PowerShell-Skripten

Falls das Skript bei dir nicht ausgeführt werden kann und eine Fehlermeldung zur Ausführungsrichtlinie erscheint, muss eventuell vorher die PowerShell Execution Policy angepasst werden.

Führe dazu in einer PowerShell mit Administratorrechten folgenden Befehl aus:


Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine

Damit erlaubst du lokal signierte Skripte und selbst erstellte Skripte, ohne die Sicherheit vollständig aufzuheben. Anschließend kannst du das Update-Skript wie beschrieben starten.

Das Bereinigungsskript

Das folgende PowerShell-Skript kann direkt in der PowerShell ISE eingefügt und als Administrator ausgeführt werden:


#region Hilfsfunktionen

function Test-Admin {
    $currentUser = [Security.Principal.WindowsIdentity]::GetCurrent()
    $principal   = New-Object Security.Principal.WindowsPrincipal($currentUser)
    return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}

function Write-Header {
    param(
        [string]$Text
    )
    Write-Host ""
    Write-Host "==================== $Text ====================" -ForegroundColor Cyan
}

function Pause-Script {
    Write-Host ""
    Read-Host "Drücke [Enter], um fortzufahren"
}

#endregion

#region Bereinigungsfunktionen

function Clear-TempFiles {
    Write-Header "Temporäre Dateien löschen"

    $paths = @()

    # Benutzer-Temp
    $paths += $env:TEMP
    $paths += $env:TMP

    # System-Temp
    $paths += "C:\Windows\Temp"

    # Duplikate raus
    $paths = $paths | Where-Object { $_ -and (Test-Path $_) } | Select-Object -Unique

    foreach ($path in $paths) {
        Write-Host "Lösche temporäre Dateien in: $path"
        try {
            Get-ChildItem -Path $path -Recurse -Force -ErrorAction SilentlyContinue |
                Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
        } catch {
            Write-Warning "Fehler beim Löschen in '$path': $($_.Exception.Message)"
        }
    }

    Write-Host "Temporäre Dateien wurden (soweit möglich) gelöscht." -ForegroundColor Green
}

function Clear-RecycleBinSafe {
    Write-Header "Papierkorb leeren"

    try {
        # Clear-RecycleBin gibt es ab PowerShell 5
        Clear-RecycleBin -Force -ErrorAction Stop
        Write-Host "Papierkorb wurde geleert." -ForegroundColor Green
    } catch {
        Write-Warning "Konnte Clear-RecycleBin nicht ausführen: $($_.Exception.Message)"
        Write-Warning "Du kannst den Papierkorb alternativ manuell über den Desktop leeren."
    }
}

function Clear-WindowsUpdateCache {
    Write-Header "Windows Update Download-Cache löschen"

    Write-Host "ACHTUNG: Windows Update wird danach ggf. manche Updates neu herunterladen müssen." -ForegroundColor Yellow
    $confirm = Read-Host "Fortfahren? (J/N)"
    if ($confirm -notin @("J","j","Y","y","Ja","ja")) {
        Write-Host "Aktion abgebrochen."
        return
    }

    $servicesToStop = @("wuauserv", "bits")

    foreach ($svc in $servicesToStop) {
        Write-Host "Stoppe Dienst: $svc"
        try {
            Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue
        } catch {
            Write-Warning "Konnte Dienst '$svc' nicht stoppen: $($_.Exception.Message)"
        }
    }

    $wuPath = "C:\Windows\SoftwareDistribution\Download"
    if (Test-Path $wuPath) {
        Write-Host "Lösche Dateien in: $wuPath"
        try {
            Get-ChildItem -Path $wuPath -Recurse -Force -ErrorAction SilentlyContinue |
                Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
            Write-Host "Windows Update Download-Cache gelöscht." -ForegroundColor Green
        } catch {
            Write-Warning "Fehler beim Löschen des Windows Update Caches: $($_.Exception.Message)"
        }
    } else {
        Write-Host "Pfad '$wuPath' wurde nicht gefunden. Eventuell bereits bereinigt."
    }

    foreach ($svc in $servicesToStop) {
        Write-Host "Starte Dienst: $svc"
        try {
            Start-Service -Name $svc -ErrorAction SilentlyContinue
        } catch {
            Write-Warning "Konnte Dienst '$svc' nicht starten: $($_.Exception.Message)"
        }
    }
}

function Run-DiskCleanup {
    Write-Header "Klassische Datenträgerbereinigung starten"

    # Systemlaufwerk ermitteln (in der Regel C:)
    $systemDrive = $env:SystemDrive
    Write-Host "Starte cleanmgr.exe für Laufwerk $systemDrive ..."

    $cleanMgr = Join-Path $env:SystemRoot "system32\cleanmgr.exe"
    if (Test-Path $cleanMgr) {
        # /LOWDISK führt eine schnelle Bereinigung mit Voreinstellungen durch
        Start-Process -FilePath $cleanMgr -ArgumentList "/LOWDISK /d $systemDrive"
        Write-Host "Datenträgerbereinigung wurde gestartet (ggf. Fenster im Hintergrund)." -ForegroundColor Green
    } else {
        Write-Warning "cleanmgr.exe wurde nicht gefunden. Auf neueren Windows-Versionen ist sie u.U. entfernt oder deaktiviert."
    }
}

function Run-DISMComponentCleanup {
    Write-Header "Komponentenstore bereinigen (DISM)"

    Write-Host "DISM /Online /Cleanup-Image /StartComponentCleanup wird ausgeführt..."
    Write-Host "Dies kann einige Zeit dauern. Bitte warten, bis der Vorgang abgeschlossen ist." -ForegroundColor Yellow

    try {
        dism.exe /Online /Cleanup-Image /StartComponentCleanup
        Write-Host "DISM-Bereinigung abgeschlossen." -ForegroundColor Green
    } catch {
        Write-Warning "Fehler bei der DISM-Bereinigung: $($_.Exception.Message)"
    }
}

#endregion

#region Menü

if (-not (Test-Admin)) {
    Write-Warning "Dieses Skript sollte als Administrator ausgeführt werden!"
    Write-Warning "Bitte PowerShell/PowerShell ISE mit Rechtsklick 'Als Administrator ausführen' starten."
    Pause-Script
    return
}

do {
    Clear-Host
    Write-Host "#########################################################"
    Write-Host "#       Windows Speicherbereinigung (PowerShell)        #"
    Write-Host "#########################################################"
    Write-Host ""
    Write-Host "Bitte wähle eine Option:"
    Write-Host "  [1] Temporäre Dateien löschen (Benutzer + System)"
    Write-Host "  [2] Papierkorb leeren"
    Write-Host "  [3] Windows Update Download-Cache löschen"
    Write-Host "  [4] Datenträgerbereinigung (cleanmgr.exe) starten"
    Write-Host "  [5] Komponentenstore bereinigen (DISM)"
    Write-Host "  [A] Alle sinnvollen Bereinigungen (1–3 + 5)"
    Write-Host "  [Q] Beenden"
    Write-Host ""

    $choice = Read-Host "Auswahl"

    switch ($choice.ToUpper()) {
        "1" {
            Clear-TempFiles
            Pause-Script
        }
        "2" {
            Clear-RecycleBinSafe
            Pause-Script
        }
        "3" {
            Clear-WindowsUpdateCache
            Pause-Script
        }
        "4" {
            Run-DiskCleanup
            Pause-Script
        }
        "5" {
            Run-DISMComponentCleanup
            Pause-Script
        }
        "A" {
            Clear-TempFiles
            Clear-RecycleBinSafe
            Clear-WindowsUpdateCache
            Run-DISMComponentCleanup
            Write-Host ""
            Write-Host "Alle ausgewählten Bereinigungen wurden ausgeführt." -ForegroundColor Green
            Pause-Script
        }
        "Q" {
            Write-Host "Programm wird beendet..."
        }
        Default {
            Write-Warning "Ungültige Auswahl. Bitte versuche es erneut."
            Pause-Script
        }
    }

} while ($choice.ToUpper() -ne "Q")

#endregion

Anleitung zur Verwendung

Um das Skript zu verwenden, öffnest du zunächst die PowerShell ISE. Wichtig ist, dass du sie als Administrator ausführst, da einige Verzeichnisse sonst nicht bereinigt werden können. Nach dem Start legst du ein neues Skript an und fügst dort den vollständigen Code ein. Anschließend speicherst du die Datei ab, zum Beispiel unter dem Namen WindowsCleanup.ps1. Mit der Taste F5 startest du das Skript, woraufhin sich ein Menü öffnet, über das du entscheiden kannst, welche Bereinigungsvorgänge durchgeführt werden sollen.

Welche Daten werden entfernt?

Das Skript entfernt sämtliche temporären Dateien sowohl im Benutzer- als auch im Systembereich. Außerdem leert es den Papierkorb und kann den Download-Cache von Windows Update löschen, der im Ordner SoftwareDistribution gespeichert ist und schnell mehrere Gigabyte groß werden kann. Mit der DISM-Bereinigung werden darüber hinaus ältere oder überfällige Komponenten aus dem Windows-Komponentenstore entfernt.

Wie viel Speicherplatz lässt sich zurückgewinnen?

Die Menge des freigewordenen Speicherplatzes hängt vom individuellen System ab. In der Regel lassen sich jedoch mehrere Gigabyte entfernen. Besonders ältere oder häufig genutzte Systeme profitieren spürbar davon. In manchen Fällen konnten durch die Kombination aus Temp-Bereinigung, Update-Cache-Löschung und DISM sogar deutlich über zehn Gigabyte Speicherplatz freigegeben werden.

Alle Angaben ohne Gewähr.

Comments

No comments yet. Why don’t you start the discussion?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert