![]() |
Batchscript zum automatischen Löschen von Dateien
Ich habe folgendes Batchscript, um zusätzliche Backups von meinen Daten auf dem NAS auf dem Llokalen PC zu machen:
Code:
Wie man sieht wird ein Ordner mit aktuellem Datum und Zeit angelegt, in dem dann die Dateien einfach kopiert werden. jetzt ist es aber so, dass auch ein TB irgendwann mal voll ist. Ich wollte jetzt, dass das Script vor dem Kopieren, das älteste Backup löscht, so dass immer genug Speicherplatz für ein neues Backup ist. Bisher habe ich immer vorher immer selbst geguckt, ob ich ein altes Backup von Hand löschen muss. Das würde ich gerne im Script automatisieren.
@echo off
rem Projekt : Backupskript NAS auf Zeus rem Autor : Michael Puff <mail@michael-puff.de> rem Datum : 2019-05-21 set h=%time:~0,2% set m=%time:~3,2% Set CTIME=%h%-%m% :DATEN echo Dateien von Herakles auf Zeus Laufwerk D: Backup sichern echo VC Container "Dokumente" trennen... veracrypt /d /l y /f /q echo Daten sicher nach Zeus\D: Backup ... md "D:\%date% %CTIME% robocopy "Z:" "D:\%date% %CTIME%" /MIR /A-:A /XD "Z:\#recycle" /V attrib "D:\%date% %CTIME%" /S /D -S -H Pause (Bitte keine Vorschläge für externe, zusätzliche Programme.) |
AW: Batchscript zum automatischen Löschen von Dateien
Mit dir /OD kannst Du Dir die Verzeichnisse sortiert nach Datum ausgeben lassen.
Mit dir /AD bekommst Du nur die Verzeichnisse ausgegeben. Mit dir /b bekommst Du nur die Namen. Mit dir /OD /AD /b bekommst Du die Verzeichnisnamen sortiert nach Datum. Mit dir /O-D /AD /b bekommst Du die Verzeichnisnamen absteigend sortiert nach Datum. Versteckte, schreibgeschützte und Systemverzeichnisse sollen nicht berücksichtigt werden, sie müssen erhalten bleiben. Dies sollte mit dir /O-D /AD-r-s-h /b gehen. Mit 'nem > leitest Du die Ausgabe in eine Datei um. Jede neue Ausgabe überschreibt eine ggfls. vorhanden Datei. Bei mehreren Ausgaben hintereinander enthält daher die Datei nur die letzte Ausgabe. Das kannst Du nun in einer For-Schleife abarbeiten und in eine Datei ausgeben lassen. Daraus wird dann
Code:
In der Datei loesch.das.Verzeichnis steht nun der Name des ältesten Verzeichnisses.
for /f usebackq %i in (`dir /O-D /AD-r-s-h /b`) do @echo %i > loesch.das.Verzeichnis
Diese Datei kannst Du nun als Eingabe für eine weitere For-Schleife nutzen.
Code:
Bevor Du das jetzt einfach "losschickst" schau Dir bitte die Syntax der genutzen Befehle auf der Kommandozeile an, damit Du a weißt, was da passiert und Du b (und das ist wichtiger) nachprüfen kannst, ob ich hier jetzt nicht gerade argen Unsinn geschrieben habe ;-)
for /f %i in (loesch.das.Verzeichnis) do rd /q /s %i
Als Batch zusammengedaddelt käme ungefähr sowas dabei raus:
Code:
Und das ist natürlich ungetestet, nur so als Idee.
rem alte Ausgabedatei ggfls. loeschen
if exists loesch.das.Verzeichnis del loesch.das.Verzeichnis rem aeltestes Verzeichnis ermitteln: for /f usebackq %%i in (`dir /O-D /AD-r-s-h /b `) do @echo %%i > loesch.das.Verzeichnis rem aeltestes Verzeichnis ohne Nachfrage rekursiv loeschen for /f %%i in (loesch.das.Verzeichnis) do rd /q /s %%i rem Ausgabedatei loeschen if exists loesch.das.Verzeichnis del loesch.das.Verzeichnis |
AW: Batchscript zum automatischen Löschen von Dateien
Super. Dank dir. Sieht gut aus. :thumb:
|
AW: Batchscript zum automatischen Löschen von Dateien
Für den Fall, dass es nicht um das älteste Backup geht sondern eine bestimmte Anzahl von Backupstufen existieren sollen, geht das ebenfalls recht einfach mit Batch:
Code:
Der Code bezieht sich zwar auf Dateien statt Verzeichnisse, aber das Prinzip sollte klar werden.
set RETAINBACKUPS=15
set BACKUPDIR=D:\rive\some\path ... for /F "skip=%RETAINBACKUPS% delims=" %%F ('dir /B /A-D /O-D "%BACKUPDIR%" 2^>NUL') DO ( del /F "%BACKUPDIR%\%%F" ) Grüße Dalai |
AW: Batchscript zum automatischen Löschen von Dateien
Sahne!
Hoffentlich kann ich mir den Thread merken. Gruß K-H |
AW: Batchscript zum automatischen Löschen von Dateien
Zitat:
Es sieht bei mir so aus:
Code:
Und so weiter. Ich will jetzt, sagen wir drei Sicherungen, behalten. Wie müsste ich den Code anpassen?
2019-05-10 13-41
2019-05-15 13-41 2019-05-18 13-41 2019-05-21 13-41 |
AW: Batchscript zum automatischen Löschen von Dateien
Sorry in der For-Schleife ist das *. absolut überflüssig bzw. kontaproduktiv. Habe es oben entfernt.
|
AW: Batchscript zum automatischen Löschen von Dateien
:oops: Im Code oben fehlte das wichtige IN vor der ersten öffnenden Klammer.
Nun korrigiert und auf Verzeichnisse angepasst:
Code:
Wenn die Ausgabe passt, kannst du einfach das echo vor dem rmdir entfernen, um tatsächlich zu löschen. Es sollte klar sein, dass derartige Löschaktionen endgültig sind. Also immer schön testen, ggf. mit Kopien.
@echo off
set RETAINBACKUPS=3 set BACKUPDIR=D:\rive\some\path if NOT exist "%BACKUPDIR%" ( echo. echo "%BACKUPDIR%" existiert nicht. echo. pause goto :EOF ) for /F "skip=%RETAINBACKUPS% delims=" %%F IN ('dir /B /AD /O-D "%BACKUPDIR%" 2^>NUL') DO ( echo rmdir /S /Q "%BACKUPDIR%\%%F" ) [EDIT] Noch eine Kleinigkeit: Die Zahl der verbleibenden Stufen ist eigentlich nicht ganz korrekt. Es werden so viele Stufen behalten wie angegeben, aber wenn das neue Backup nach dem Löschen erfolgt, liegt letztlich eine Stufe mehr im %BACKUPDIR%. [/EDIT] Grüße Dalai |
AW: Batchscript zum automatischen Löschen von Dateien
Ich war gerade am debuggen. Das Script hat sich nämlich ohne was zu machen verabschiedet.
|
AW: Batchscript zum automatischen Löschen von Dateien
Irgendwie sehe ich keine Ausgabe bis auf die Pause Befehle. Müsste das Script nicht
Zitat:
Code:
Jetzt geht es. Ausgabe:
@echo off
set RETAINBACKUPS=15 set BACKUPDIR=D:\ if not exist "%BACKUPDIR%" ( echo. echo "%BACKUPDIR%" existiert nicht. echo. pause goto :EOF ) pause for /F "skip=%RETAINBACKUPS% delims=" %%F IN ('dir /B /AD /O-D "%BACKUPDIR%" 2^>NUL') DO ( echo rmdir /S /Q "%BACKUPDIR%\%%F" ) pause rem freien Speicherplatz anzeigen rem for /f "tokens=3" %%i in ('dir /-c^|findstr /c:"Bytes frei"') do set tmp=%%i rem echo Freier Speicherplatz auf Laufwerk D: %tmp:~0,3% GB pause
Code:
Bei
rmdir /S /Q "D:\\$RECYCLE.BIN"
rmdir /S /Q "D:\\System Volume Information"
Code:
Ich habe jetzt die Verzeichnisse
set RETAINBACKUPS=1
Code:
Gebe ich an er soll 3 behalten, bekomme ich die Ausgabe:
2019-05-10 13-41
2019-05-18 13-41 2019-05-21 13-41
Code:
Das passt. Aber natürlich soll er die Systemordner nicht löschen.
rmdir /S /Q "D:\\$RECYCLE.BIN"
rmdir /S /Q "D:\\System Volume Information" Gebe ich an er soll 1 behalten, bekomme ich die Ausgabe:
Code:
Er löscht also das älteste und das neuste.
rmdir /S /Q "D:\\2019-05-10 13-41"
rmdir /S /Q "D:\\2019-05-21 13-41" rmdir /S /Q "D:\\$RECYCLE.BIN" rmdir /S /Q "D:\\System Volume Information"
Code:
liefert mir
dir /AD
Code:
Wenn ich dir so hinbekomme, dass es die Systemverzeichnisse nicht anzeigt, wäre das Problem wahrscheinlich gelöst.
D:\>dir /AD
Datenträger in Laufwerk D: ist Backup Volumeseriennummer: B860-37EC Verzeichnis von D:\ 2019-05-21 13:31 <DIR> $RECYCLE.BIN 2019-05-21 20:00 <DIR> 2019-05-10 13-41 2019-05-21 20:00 <DIR> 2019-05-18 13-41 2019-05-21 14:58 <DIR> 2019-05-21 13-41 2019-05-21 13:30 <DIR> System Volume Information 0 Datei(en), 0 Bytes 5 Verzeichnis(se), 833.302.568.960 Bytes frei Habs:
Code:
Nur will er mir bei einem Backup immer noch das älteste und neuste löschen.
dir /AD
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz