Alte Dateien automatisch löschen: So geht’s mit PowerShell

✅ Aktualisiert am

In vielen Ordnern sammeln sich mit der Zeit Dateien an, die längst nicht mehr gebraucht werden. Besonders bei heruntergeladenen Dateien, alten Protokollen oder temporären Sicherungen kann das schnell unübersichtlich werden. Möchtest du solche alten Dateien automatisch löschen, lässt sich das unter Windows 11 mit PowerShell erledigen.

Dabei kannst du genau festlegen, wie alt eine Datei sein muss, bevor sie entfernt wird. Beispielsweise lassen sich alle Dateien löschen, die seit mehr als 30 Tagen nicht mehr verändert wurden. Auch eine Beschränkung auf bestimmte Dateitypen ist möglich.

Wenn du zunächst herausfinden möchtest, welche Dateien und Ordner besonders viel Platz benötigen, kannst du dir anzeigen lassen, was deinen Speicherplatz auf Laufwerk C belegt.

Der Vorteil: Du musst nicht regelmäßig jeden Ordner selbst durchsuchen. Mit der Windows-Aufgabenplanung kann die Bereinigung sogar zu festgelegten Zeiten stattfinden.

Allerdings solltest du bei solchen Befehlen vorsichtig sein. PowerShell löscht Dateien normalerweise direkt, ohne sie vorher in den Papierkorb zu verschieben. Deshalb ist es sinnvoll, zunächst nur nach passenden Dateien zu suchen und den Löschvorgang anschließend zu testen.

Alte Dateien mit PowerShell finden

Bevor du Dateien löschen kannst, musst du festlegen, welche Dateien überhaupt betroffen sein sollen. PowerShell kann dafür verschiedene Eigenschaften auswerten, beispielsweise das Änderungsdatum einer Datei.

Für die folgenden Beispiele verwenden wir einen Ordner namens C:\Testordner. Diesen kannst du im Datei-Explorer selbst erstellen und einige Testdateien hineinkopieren.

Öffne anschließend PowerShell über das Startmenü. Du kannst dazu nach „PowerShell“ suchen und die Anwendung starten. Für einen Ordner, auf den dein Benutzerkonto zugreifen darf, sind normalerweise keine Administratorrechte erforderlich.

Mit folgendem Befehl findest du alle Dateien im Testordner, die seit mehr als 30 Tagen nicht verändert wurden:

Get-ChildItem -LiteralPath "C:\Testordner" -File |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) }

PowerShell durchsucht den angegebenen Ordner und zeigt alle passenden Dateien an. Es wird noch nichts gelöscht.

PowerShell zeigt Dateien an, die älter als 30 Tage sind
PowerShell zeigt alle Dateien im Testordner an, deren letztes Änderungsdatum mehr als 30 Tage zurückliegt.

Der Befehl besteht aus mehreren Teilen:

  • Get-ChildItem liest den Inhalt des angegebenen Ordners aus.
  • -LiteralPath legt den Ordnerpfad fest.
  • -File beschränkt die Suche auf Dateien und schließt Ordner aus.
  • Where-Object filtert die gefundenen Dateien.
  • LastWriteTime enthält den Zeitpunkt der letzten Änderung.
  • (Get-Date).AddDays(-30) berechnet den Zeitpunkt vor 30 Tagen.
  • -lt bedeutet „kleiner als“ beziehungsweise in diesem Fall „früher als“.

Weitere Informationen zu den verfügbaren Parametern findest du in der offiziellen Microsoft-Dokumentation zu Get-ChildItem.

Entscheidend ist also das Änderungsdatum. Eine Datei, die vor einem Jahr erstellt, aber gestern bearbeitet wurde, gehört nicht zu den Ergebnissen.

Um statt 30 Tagen einen anderen Zeitraum zu verwenden, musst du lediglich die Zahl hinter AddDays ändern. Für 60 Tage verwendest du beispielsweise AddDays(-60).

Dateien vor dem Löschen übersichtlich anzeigen

Bei einer größeren Anzahl gefundener Dateien kann die normale PowerShell-Ausgabe unübersichtlich werden. Deshalb lohnt es sich, nur die wichtigsten Informationen anzeigen zu lassen.

Mit diesem Befehl erhältst du eine Liste mit Dateinamen, Änderungsdatum und Dateigröße:

Get-ChildItem -LiteralPath "C:\Testordner" -File |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Select-Object Name, LastWriteTime, Length

Die Spalte Length zeigt die Dateigröße in Bytes an. So kannst du besser erkennen, welche Dateien möglicherweise besonders viel Speicherplatz belegen.

Möchtest du die vollständigen Dateipfade sehen, kannst du stattdessen FullName verwenden:

Get-ChildItem -LiteralPath "C:\Testordner" -File |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Select-Object FullName, LastWriteTime

Diese Variante ist besonders hilfreich, wenn du später auch Unterordner durchsuchen möchtest. Du siehst dann genau, wo sich die einzelnen Dateien befinden.

Wichtig: Kontrolliere die Ergebnisse sorgfältig. Eine Datei ist nicht automatisch überflüssig, nur weil sie seit längerer Zeit nicht verändert wurde.

Alte Dateien automatisch löschen mit PowerShell

Nachdem du die gefundenen Dateien überprüft hast, kannst du sie mit PowerShell entfernen. Dafür wird der Befehl Remove-Item verwendet.

Bevor tatsächlich etwas gelöscht wird, solltest du allerdings einen Testlauf durchführen. PowerShell bietet dafür den Parameter -WhatIf.

Der vollständige Befehl lautet:

Get-ChildItem -LiteralPath "C:\Testordner" -File |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Remove-Item -WhatIf

PowerShell zeigt nun an, welche Dateien gelöscht würden. Tatsächlich verändert der Befehl aber nichts.

Microsoft beschreibt den Parameter -WhatIf in der offiziellen Dokumentation zu Remove-Item. Er zeigt die geplante Aktion an, ohne sie auszuführen.

PowerShell simuliert das Löschen alter Dateien mit WhatIf
Mit dem Parameter -WhatIf zeigt PowerShell an, welche Dateien gelöscht würden, ohne sie tatsächlich zu entfernen.

Das ist besonders praktisch, wenn du den Ordnerpfad oder die Filterbedingungen gerade erst eingerichtet hast.

Kontrolliere die angezeigten Dateipfade. Wenn ausschließlich die gewünschten Dateien betroffen sind, kannst du den Parameter -WhatIf entfernen.

Der eigentliche Löschbefehl sieht dann so aus:

Get-ChildItem -LiteralPath "C:\Testordner" -File |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Remove-Item

Jetzt werden die passenden Dateien tatsächlich gelöscht.

Achtung: Die so entfernten Dateien landen normalerweise nicht im Windows-Papierkorb. Eine Wiederherstellung ist deshalb nicht ohne Weiteres möglich. Verwende den Befehl zunächst ausschließlich in einem Testordner und sichere wichtige Daten vorher.

Auf Bestätigungsabfragen solltest du dich als Schutz nicht verlassen. Je nach Befehl und Umgebung kann die Löschung ohne weitere Rückfrage erfolgen.

Nur bestimmte Dateitypen automatisch löschen

Nicht immer sollen sämtliche alten Dateien aus einem Ordner verschwinden. Häufig ist es sinnvoller, die Bereinigung auf bestimmte Dateitypen zu beschränken.

Ein typisches Beispiel sind Protokolldateien mit der Endung .log. Solche Dateien werden von verschiedenen Programmen angelegt und können sich über längere Zeit ansammeln.

Wenn du ausschließlich LOG-Dateien entfernen möchtest, die älter als 30 Tage sind, verwendest du folgenden Befehl:

Get-ChildItem -LiteralPath "C:\Testordner" -Filter "*.log" -File |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Remove-Item -WhatIf

Durch -Filter "*.log" berücksichtigt PowerShell nur Dateien mit der entsprechenden Endung.

Du kannst den Filter auch für andere Dateitypen verwenden:

FilterBerücksichtigte Dateien
*.logProtokolldateien
*.tmpDateien mit der Endung TMP
*.bakSicherungsdateien mit der Endung BAK
*.zipZIP-Archive
*.txtTextdateien

Die Dateiendung allein sagt allerdings nichts darüber aus, ob eine Datei noch benötigt wird. Gerade ZIP-Archive oder BAK-Dateien können wichtige Sicherungen enthalten.

Deshalb empfiehlt es sich, solche Filter nur in Ordnern einzusetzen, deren Inhalt du kennst.

Wenn der Testlauf die gewünschten Ergebnisse zeigt, kannst du auch hier -WhatIf entfernen.

Unterordner bei der Bereinigung berücksichtigen

Standardmäßig durchsucht Get-ChildItem nur den angegebenen Ordner. Dateien in darunterliegenden Verzeichnissen werden nicht berücksichtigt.

Mit dem Parameter -Recurse kannst du die Suche auf sämtliche Unterordner erweitern.

Ein Beispiel:

Get-ChildItem -LiteralPath "C:\Testordner" -File -Recurse |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Remove-Item -WhatIf

PowerShell durchsucht jetzt den Testordner einschließlich seiner Unterordner. Alle Dateien, deren Änderungsdatum mehr als 30 Tage zurückliegt, werden für die Löschung vorgemerkt.

Das kann beispielsweise sinnvoll sein, wenn ein Programm seine Protokolle in mehreren Unterverzeichnissen ablegt.

Die Ordner selbst werden durch diesen Befehl nicht gelöscht. Es geht ausschließlich um Dateien.

Bei -Recurse ist besondere Vorsicht angebracht. Je nach Ordnerstruktur können sehr viele Dateien betroffen sein. Nutze deshalb unbedingt den Testlauf und kontrolliere die Ausgabe, bevor du eine Löschung ausführst.

Verwende solche Befehle nicht pauschal für das gesamte Laufwerk C:\, den Windows-Ordner oder andere Systemverzeichnisse.

PowerShell-Bereinigung als Skript speichern

Wenn du regelmäßig dieselben Ordner bereinigen möchtest, musst du den PowerShell-Befehl nicht jedes Mal neu eingeben.

Stattdessen kannst du ihn als Skript speichern. Eine solche Datei besitzt die Endung .ps1 und enthält PowerShell-Anweisungen, die sich später erneut ausführen lassen.

Erstelle zunächst einen Ordner C:\Scripts. Öffne anschließend den Windows-Editor und füge folgenden Inhalt ein:

$Ordner = "C:\Testordner"
$Tage = 30
$Grenzdatum = (Get-Date).AddDays(-$Tage)

Get-ChildItem -LiteralPath $Ordner -File |
Where-Object { $_.LastWriteTime -lt $Grenzdatum } |
Remove-Item -WhatIf

Speichere die Datei unter dem Namen AlteDateienLoeschen.ps1 im Ordner C:\Scripts.

Achte beim Speichern darauf, als Dateityp „Alle Dateien“ auszuwählen. Andernfalls könnte der Editor versehentlich eine Datei mit der Endung .ps1.txt erstellen.

Das Skript verwendet drei Variablen:

  • $Ordner enthält das Verzeichnis, das bereinigt werden soll.
  • $Tage bestimmt, wie alt die Dateien mindestens sein müssen.
  • $Grenzdatum enthält den berechneten Zeitpunkt, mit dem die Änderungsdaten verglichen werden.

Der Vorteil dieser Lösung liegt in der einfachen Anpassung. Möchtest du Dateien beispielsweise erst nach 90 Tagen löschen, änderst du lediglich $Tage = 30 in $Tage = 90.

Zum Testen kannst du das Skript in PowerShell mit folgendem Befehl starten:

& "C:\Scripts\AlteDateienLoeschen.ps1"

Falls Windows die Ausführung aufgrund der PowerShell-Ausführungsrichtlinie verhindert, kannst du für die aktuelle PowerShell-Sitzung eine begrenzte Freigabe setzen:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned

Diese Einstellung gilt nur für den aktuellen Prozess und ändert nicht dauerhaft die Ausführungsrichtlinie des Computers. Eine übergeordnete Gruppenrichtlinie kann sie weiterhin einschränken. Verwende sie ausschließlich für Skripte, deren Inhalt du kennst und überprüft hast.

Solange -WhatIf enthalten ist, führt das Skript nur einen Testlauf durch. Für die spätere automatische Bereinigung musst du den Parameter entfernen, nachdem du die Dateiauswahl kontrolliert hast.

Alte Dateien über die Windows-Aufgabenplanung automatisch löschen

Mit der Windows-Aufgabenplanung lässt sich das gespeicherte PowerShell-Skript regelmäßig ausführen. Damit ist es beispielsweise möglich, einmal täglich oder wöchentlich alte Dateien zu entfernen.

Wenn du lediglich temporäre Windows-Dateien automatisch entfernen möchtest, ist die integrierte Speicheroptimierung von Windows 11 häufig die einfachere Lösung.

Die Einrichtung funktioniert unter Windows 11 ohne zusätzliche Software.

Neue Aufgabe erstellen

  1. Drücke Windows + R, gib taskschd.msc ein und bestätige mit Enter.
  2. Klicke rechts auf „Aufgabe erstellen“.
  3. Vergib im Register „Allgemein“ einen Namen wie „Alte Dateien bereinigen“.
  4. Wähle unter den Sicherheitsoptionen zunächst „Nur ausführen, wenn der Benutzer angemeldet ist“.
  5. Öffne das Register „Trigger“ und klicke auf „Neu“.
  6. Lege fest, wann die Bereinigung stattfinden soll, beispielsweise täglich um 18 Uhr.
  7. Bestätige die Einstellungen mit „OK“.

Damit hast du festgelegt, wann Windows die Aufgabe starten soll.

PowerShell-Skript als Aktion hinterlegen

Wechsle anschließend zum Register „Aktionen“ und klicke auf „Neu“.

Wähle als Aktion „Programm starten“ und trage folgende Werte ein:

FeldEingabe
Programm/Skriptpowershell.exe
Argumente hinzufügen-NoProfile -NonInteractive -File "C:\Scripts\AlteDateienLoeschen.ps1"
Starten inC:\Scripts
PowerShell-Skript in der Windows-Aufgabenplanung automatisch starten
In der Windows-Aufgabenplanung legst du fest, welches PowerShell-Skript automatisch ausgeführt werden soll.

Bestätige die Eingaben und speichere die Aufgabe.

Der Parameter -NoProfile sorgt dafür, dass PowerShell ohne benutzerspezifische Profilskripte startet. -NonInteractive verhindert interaktive Eingabeaufforderungen. Mit -File gibst du die auszuführende Skriptdatei an.

Falls dein Skript durch eine Ausführungsrichtlinie blockiert wird, solltest du die Ursache prüfen und die Ausführung gezielt ermöglichen. Ein dauerhaftes Abschalten der PowerShell-Sicherheitsmechanismen ist dafür nicht erforderlich.

Automatische Bereinigung testen

Bevor du die Aufgabe dauerhaft verwendest, solltest du ihre Funktion kontrollieren.

Klicke dazu in der Aufgabenplanung mit der rechten Maustaste auf die neue Aufgabe und wähle „Ausführen“.

Kontrolliere anschließend den Aufgabenstatus und das Feld „Letztes Ausführungsergebnis“. Beachte dabei, dass ein erfolgreich gestarteter PowerShell-Prozess noch nicht garantiert, dass sämtliche gewünschten Dateien gelöscht wurden.

Für den ersten Test sollte im Skript weiterhin -WhatIf stehen. Da die Ausgabe einer geplanten Aufgabe normalerweise nicht sichtbar ist, lässt sich das Ergebnis besser durch einen zusätzlichen manuellen Skriptaufruf überprüfen.

Wenn alles korrekt eingerichtet ist, kannst du -WhatIf aus dem gespeicherten Skript entfernen.

Prüfe die Aufgabe anschließend mit eigens angelegten Testdateien. Erst danach solltest du den Ordner auf dein tatsächliches Bereinigungsverzeichnis ändern.

Ein weiterer Punkt: Die Aufgabe kann nur ausgeführt werden, wenn die eingestellten Bedingungen erfüllt sind. Ist der Computer zum geplanten Zeitpunkt ausgeschaltet, findet die Bereinigung nicht automatisch zu dieser Uhrzeit statt. In den Einstellungen der Aufgabe kannst du festlegen, dass ein verpasster Start möglichst bald nachgeholt wird.

Gelöschte Dateien und Bereinigung protokollieren

Bei einer automatischen Bereinigung ist es sinnvoll, nachvollziehen zu können, welche Dateien entfernt wurden. Das erleichtert die Fehlersuche und hilft dabei, unerwartete Löschvorgänge zu erkennen.

Dafür kannst du dein Skript um eine einfache Protokollierung erweitern.

Das folgende Beispiel schreibt erfolgreich gelöschte Dateien in eine Textdatei:

$Ordner = "C:\Testordner"
$Tage = 30
$Grenzdatum = (Get-Date).AddDays(-$Tage)
$Protokoll = "C:\Scripts\Bereinigung.log"

Get-ChildItem -LiteralPath $Ordner -File |
Where-Object { $_.LastWriteTime -lt $Grenzdatum } |
ForEach-Object {
    $Dateipfad = $_.FullName

    try {
        Remove-Item -LiteralPath $Dateipfad -ErrorAction Stop
        "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Geloescht: $Dateipfad" |
            Out-File -FilePath $Protokoll -Append -Encoding UTF8
    }
    catch {
        "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Fehler: $Dateipfad - $($_.Exception.Message)" |
            Out-File -FilePath $Protokoll -Append -Encoding UTF8
    }
}

Bei jedem erfolgreichen Löschvorgang wird der Dateipfad zusammen mit dem aktuellen Zeitpunkt in die Datei Bereinigung.log geschrieben. Tritt beim Entfernen ein Fehler auf, wird stattdessen eine Fehlermeldung protokolliert.

Der Ordner C:\Scripts muss dafür bereits existieren. Außerdem benötigt das ausführende Benutzerkonto Schreibrechte für die Protokolldatei.

Achtung: Dieses Beispiel führt echte Löschvorgänge aus. Teste die Protokollierung zunächst ausschließlich mit entbehrlichen Dateien in einem separaten Testordner.

Die Protokolldatei solltest du außerhalb des zu bereinigenden Verzeichnisses speichern. So verhinderst du, dass sie später selbst von der Bereinigung erfasst wird.

Für private Anwendungsfälle reicht eine solche einfache Protokollierung häufig aus. Wenn sehr viele Dateien verarbeitet werden, kann es sinnvoll sein, das Protokoll regelmäßig zu archivieren oder seine Größe zu begrenzen.

Wenn PowerShell alte Dateien nicht löscht

Manchmal werden trotz eines korrekt aufgebauten Befehls keine Dateien entfernt. Die Ursache liegt häufig bei fehlenden Berechtigungen oder einer nicht passenden Filterbedingung.

Die folgenden Punkte solltest du überprüfen:

ProblemMögliche Ursache und Lösung
Keine Dateien gefundenÄnderungsdatum und Zeitraum kontrollieren
Zugriff verweigertBerechtigungen des Benutzerkontos prüfen
Datei kann nicht gelöscht werdenMöglicherweise wird sie von einem Programm verwendet
Unterordner fehlenPrüfen, ob -Recurse verwendet wird
Skript startet nichtAusführungsrichtlinie und Skriptpfad kontrollieren
Geplante Aufgabe funktioniert nichtBenutzerkonto, Trigger, Bedingungen und Aufgabenverlauf prüfen

Besonders häufig wird das Änderungsdatum falsch eingeschätzt. Eine Datei kann bereits mehrere Jahre auf dem Computer liegen und trotzdem ein aktuelles Änderungsdatum besitzen.

Auch die Berechtigungen können Probleme verursachen. PowerShell kann normalerweise nur Dateien löschen, für die das ausführende Benutzerkonto die erforderlichen Rechte besitzt.

Es ist keine gute Idee, solche Probleme pauschal durch eine PowerShell-Sitzung mit Administratorrechten zu umgehen. Prüfe zuerst, ob der ausgewählte Ordner überhaupt für eine automatische Bereinigung geeignet ist.

Bei einer geplanten Aufgabe solltest du zusätzlich beachten, unter welchem Benutzerkonto sie ausgeführt wird. Dieses Konto benötigt sowohl Zugriff auf das Skript als auch die passenden Berechtigungen für den Zielordner.

Fazit: Alte Dateien gezielt und sicher entfernen

Mit PowerShell lassen sich alte Dateien sehr flexibel bereinigen. Besonders praktisch ist die Möglichkeit, Dateien anhand ihres Änderungsdatums auszuwählen und die Suche auf bestimmte Dateitypen oder Ordner zu beschränken.

Für gelegentliche Aufräumarbeiten reicht ein einzelner PowerShell-Befehl vollkommen aus. Eine automatische Ausführung über die Windows-Aufgabenplanung lohnt sich dagegen vor allem bei Ordnern, in denen regelmäßig neue Protokolle oder temporäre Dateien entstehen.

Ich empfehle, zunächst mit einem separaten Testordner zu arbeiten und die Ergebnisse mit -WhatIf zu kontrollieren. Erst wenn die Auswahl zuverlässig funktioniert, sollte die tatsächliche Löschung aktiviert werden.

Für persönliche Dokumente, Fotos oder wichtige Sicherungen ist eine pauschale Bereinigung nach Dateialter dagegen keine gute Lösung. Dort sollte immer bewusst entschieden werden, welche Dateien noch benötigt werden.

Das gilt besonders für heruntergeladene Dateien. Wie du Downloads unter Windows 11 gezielt löschen kannst, ohne wichtige Dokumente zu verlieren, erkläre ich in einer separaten Anleitung.

Gefällt dir Dirks-Computerecke? Mit einem Klick kannst du diese Seite bei Google als bevorzugte Quelle festlegen – dann bekommst du meine Artikel in der Google-Suche und in den KI-Übersichten bevorzugt angezeigt.


Schreibe einen Kommentar