Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte » 

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Betriebssysteme (https://www.delphipraxis.net/27-betriebssysteme/)
-   -   Batchscript zum automatischen Löschen von Dateien (https://www.delphipraxis.net/200747-batchscript-zum-automatischen-loeschen-von-dateien.html)

Luckie 21. Mai 2019 16:11

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:
@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
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.

(Bitte keine Vorschläge für externe, zusätzliche Programme.)

Delphi.Narium 21. Mai 2019 17:14

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:
for /f usebackq %i in (`dir /O-D /AD-r-s-h /b`) do @echo %i > loesch.das.Verzeichnis
In der Datei loesch.das.Verzeichnis steht nun der Name des ältesten Verzeichnisses.

Diese Datei kannst Du nun als Eingabe für eine weitere For-Schleife nutzen.
Code:
for /f %i in (loesch.das.Verzeichnis) do rd /q /s %i
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 ;-)

Als Batch zusammengedaddelt käme ungefähr sowas dabei raus:
Code:
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
Und das ist natürlich ungetestet, nur so als Idee.

Luckie 21. Mai 2019 17:21

AW: Batchscript zum automatischen Löschen von Dateien
 
Super. Dank dir. Sieht gut aus. :thumb:

Dalai 21. Mai 2019 18:01

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:
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"
)
Der Code bezieht sich zwar auf Dateien statt Verzeichnisse, aber das Prinzip sollte klar werden.

Grüße
Dalai

p80286 21. Mai 2019 18:20

AW: Batchscript zum automatischen Löschen von Dateien
 
Sahne!
Hoffentlich kann ich mir den Thread merken.

Gruß
K-H

Luckie 21. Mai 2019 18:28

AW: Batchscript zum automatischen Löschen von Dateien
 
Zitat:

Zitat von Dalai (Beitrag 1432744)
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:
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"
)
Der Code bezieht sich zwar auf Dateien statt Verzeichnisse, aber das Prinzip sollte klar werden.

Grüße
Dalai

Das ist noch besser. Zumal ich gerade an Delphi.Nariums Code scheitere. Es steht nur "dir" in der Datei.

Es sieht bei mir so aus:
Code:
2019-05-10 13-41
2019-05-15 13-41
2019-05-18 13-41
2019-05-21 13-41
Und so weiter. Ich will jetzt, sagen wir drei Sicherungen, behalten. Wie müsste ich den Code anpassen?

Delphi.Narium 21. Mai 2019 18:37

AW: Batchscript zum automatischen Löschen von Dateien
 
Sorry in der For-Schleife ist das *. absolut überflüssig bzw. kontaproduktiv. Habe es oben entfernt.

Dalai 21. Mai 2019 18:38

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:
@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"
)
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.

[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

Luckie 21. Mai 2019 18:43

AW: Batchscript zum automatischen Löschen von Dateien
 
Ich war gerade am debuggen. Das Script hat sich nämlich ohne was zu machen verabschiedet.

Luckie 21. Mai 2019 18:50

AW: Batchscript zum automatischen Löschen von Dateien
 
Irgendwie sehe ich keine Ausgabe bis auf die Pause Befehle. Müsste das Script nicht
Zitat:

rmdir /S /Q "%BACKUPDIR%\%%F"
ausgeben?

Code:
@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
Jetzt geht es. Ausgabe:
Code:
rmdir /S /Q "D:\\$RECYCLE.BIN"
rmdir /S /Q "D:\\System Volume Information"
Bei
Code:
set RETAINBACKUPS=1
Ich habe jetzt die Verzeichnisse
Code:
2019-05-10 13-41
2019-05-18 13-41
2019-05-21 13-41
Gebe ich an er soll 3 behalten, bekomme ich die Ausgabe:
Code:
rmdir /S /Q "D:\\$RECYCLE.BIN"
rmdir /S /Q "D:\\System Volume Information"
Das passt. Aber natürlich soll er die Systemordner nicht löschen.
Gebe ich an er soll 1 behalten, bekomme ich die Ausgabe:
Code:
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"
Er löscht also das älteste und das neuste.

Code:
dir /AD
liefert mir
Code:
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
Wenn ich dir so hinbekomme, dass es die Systemverzeichnisse nicht anzeigt, wäre das Problem wahrscheinlich gelöst.

Habs:
Code:
dir /AD
Nur will er mir bei einem Backup immer noch das älteste und neuste löschen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:16 Uhr.
Seite 1 von 4  1 23     Letzte » 

Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf