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.

