Dateien löschen die älter sind als x Tage

Wie lassen sich Dateien löschen die älter sind als x Tage? Und das am besten noch ohne zusätzliche Software. Die Lösung liegt wie so oft im Helferlein Nummer 1: Der Windows PowerShell. In diesem Artikel beschreibe ich Dir, wie das funktioniert.

Dateien, die älter sind als x Tage, löschen

Nachdem eines meiner Lieblingstools der letzten Jahre (delage32) durch den Manipulationsschutz einiger Sicherheitsanwendungen angemahnt wurde, habe ich mir die Funktion mit der Windows PowerShell nachgebaut. Herausgekommen ist ein kleines Skript, welches kurz und knapp alle Dateien löscht, deren Alter eine frei definierbares Alter überschritten haben.



Darüberhinaus findet eine Beschränkung auf bestimmte Dateiendungen statt. Das ist dann sinnvoll, wenn im zu überprüfenden Verzeichnis auch noch andere Dateien liegen, die eventuell nicht gelöscht werden dürfen.

Kurze Beschreibung:

  • $Source:  In dieser Variable wird der Quellordner gespeichert, in dem die zu löschenden Dateien liegen.
  • $Days:  Anzahl der Tage, nach denen Dateien gelöscht werden sollen.
  • $ext:  Array, in welchem die zu löschenden Dateiendungen gespeichert sind.

Das Skript löscht rekursiv, also auch alle Dateien in eventuell vorhandenen Unterordnern. Wenn das nicht gewünscht ist, muss in der vorletzten Zeile der Parameter „-recurse“ entfernt werden. Ebenso werden keine Ordner gelöscht, nur Dateien. Alle gelöschten Dateien werden in ein Logfile geschrieben, welches im angegebenen Quellordner gespeichert wird.

Dateien löschen, die älter sind als x Tage (PowerShell Skript)

# Autor: René Albarus - https://www.tech-faq.net
# Date: 2019/04/16
#
# Beschreibung:
# Dieses Skript löscht Dateien, die eine bestimmte Anzahl von Tagen alt sind. Die Dateierweiterungen, das Alter sowie der Ablageort sind definierbar.
# Der Löschvorgang erstreckt sich auf alle Unterordner
# Alle Operationen werden in einem Logfile im Quellordner gespeichert
#
# Hier können Sie den Quellordner, das Alter der Dateien (in Tagen) und die Dateierweiterungen festlegen
$Source = "C:\Temp\"		# Wichtig: muss mit "\" enden
$Days = 90					# Anzahl der Tage, nach denen die Dateien gelöscht werden
$ext = "*.bat","*.cat"		# Array - erweitern mit  ,".xyz" 
$log = "$Source$(get-date -format yymmddHHmmss).txt"
$DateBeforeXDays = (Get-Date).AddDays(-$Days)

# Start Script
start-transcript $log
write-host "--------------------------------------------------------------------------------------"
write-host "Löschen aller Dateien ($ext) im Ordner $Source die älter sind als $Days Tage."
write-host "--------------------------------------------------------------------------------------"
get-childitem $Source* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays -and -not $_.psiscontainer} | remove-item -force -verbose
stop-transcript

Die Ausgabe sieht folgendermaßen aus:

Dateien löschen, die älter sind als x Tage
Dateien, die älter sind als x Tage, werden gelöscht.

Das komplette Skript kannst Du auch hier als Datei herunterladen (zip, 9 kb). Es kann auch ideal für die regelmäßige Bereinigung von Ordnerstrukturen dienen, indem es über die Windows Aufgabenplanung ausgeführt wird.

Eine Funktion für das zusätzliche Entfernen von leeren Ordnern findest Du im Artikel Leere Ordner löschen per Powershell.

Wichtig: Die Anwendung des Skriptes geschieht auf eigene Gefahr. Ich übernehme keine Haftung für eventuelle Schäden. 

Ebenfalls interessant:

Dieser Artikel ist wie alle anderen auf dieser Seite kostenlos für Dich und ich hoffe, ich konnte Dir weiterhelfen. Wer möchte, kann diesem Blog eine kleine Aufmerksamkeit in Form einer kleinen Spende (PayPal) oder über die Amazon Wunschliste zukommen lassen.

15 Gedanken zu „Dateien löschen die älter sind als x Tage“

    • Hallo Peter,

      es wäre schön gewesen, wenn Du den Fehler etwas genauer beschrieben hättest. Ich habe aber gerade bei einem Test festgestellt, dass es Probleme bei Dateien mit Sonderzeichen gab (z.B. eckige Klammern). Das habe ich jetzt verbessert und erfolgreich getestet. Das Skript im Beitrag habe ich aktualisiert.

      Viele Grüße, René

      Antworten
  1. Hi René,

    dein Skript läuft perfekt. Vielen Dank dafür.
    Ich hatte ebenfalls das Problem mit den Sonderzeichen. Kannst du kurz erläutern, was die Änderung war?

    VG
    Flo

    Antworten
    • Hallo Flo,
      das Ende der vorletzten Zeile sah so aus: |% {remove-item $_.fullname -force -verbose} – damit gab es Probleme bei den Sonderzeichen

      Antworten
  2. Hallo René,

    vielen Dank fürs Zur-Verfügung stellen.

    Ich glaub ich bin zu doof. Bei mir wird die Dateiausgabe (soweit ich sehen kann) überhaupt nicht eingeschränkt.

    $Source = „E:\Datenbanksicherung\“
    $Days = 90
    $Ext = „*.7z“
    $DateBeforeXDays = (Get-Date).AddDays(-$Days)
    Get-ChildItem -Path $Source* -Include $Ext -Recurse | where {$_LastWriteTime -lt $DateBeforeXDays -and -not $_PsIsContainer}

    Hat mich am Freitag direkt mal alle (lokalen) Sicherungskopien gekostet ;X (Aber dafür hab ich ja Backups).

    Siehst du meinen Fehler?

    Danke!

    Antworten
    • Hallo Siegfried,
      ich habe in dem Artikel eine Lösung für das Löschen leerer Ordner verlinkt. Ebenso eine Anleitung zum Einbau von Powershell Skripten in die Aufgabenplanung. Ich hoffe, ich konnte Dir damit helfen.
      Viele Grüße
      René

      Antworten
  3. Hi,
    wie bekomme ich es hin, dass im jeweiligen Userverzeichnis ältere Downloaddateien gelöscht werden?
    Dateien sind unter C:\Benutzer\vorname.nachname\Downloads
    Wie kann ich eine Variable oder Platzhalter für „vorname.nachname“ im Script realisieren?

    Danke und Gruß
    Peter

    Antworten
    • Hallo Peter,

      das sollten mit der Variable %userprofile% funktionieren. Mit „%userprofile%\Downloads“ kommst Du direkt in den Downloadordner des angemeldeten Benutzers. Eine andere Möglichkeit wäre die Aktivierung der Speicheroptimierung (ab Windows 10 verfügbar).

      Viele Grüße
      René

      Antworten
      • Hallo Rene,
        Danke für Deine schnelle Antwort. Es klappt leider nicht :-(
        Es kommt die Fehlermeldung:

        get-childitem : Der Pfad „%userprofile%\Downloads“ kann nicht gefunden werden, da er nicht vorhanden ist.
        In Zeile:21 Zeichen:1

        Antworten
  4. Hallo, Danke für die Anleitung. Wie muss man es eintragen, wenn in mehreren Ordnern alte Daten gelöscht werden sollen? Also beispielsweise im Benutzerprofil nur im Ordner Downloads und in Dokumente. Und geht es (wie in Delage32), dass man unterschiedliche Altersangaben der zu löschenden Dateien angibt? Also z.B. für Downloads 2 Tage, für Dokumente 30 Tage?

    Müsste man das mit mehreren Variablen lösen, z.B. so?
    $Source_a = „$env:USERPROFILE\Downloads“
    $Days_a = 2
    $Source_b = „$env:USERPROFILE\Dokumente“
    $Days_b = 30

    Antworten

Schreibe einen Kommentar