AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Delphi-PRAXiS - Lounge Betriebssysteme Batchscript zum automatischen Löschen von Dateien

Batchscript zum automatischen Löschen von Dateien

Ein Thema von Luckie · begonnen am 21. Mai 2019 · letzter Beitrag vom 23. Mai 2019
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.188 Beiträge
 
Delphi 2006 Professional
 
#1

Batchscript zum automatischen Löschen von Dateien

  Alt 21. Mai 2019, 16:11
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.)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.023 Beiträge
 
Delphi 7 Professional
 
#2

AW: Batchscript zum automatischen Löschen von Dateien

  Alt 21. Mai 2019, 17:14
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.

Geändert von Delphi.Narium (21. Mai 2019 um 18:36 Uhr) Grund: Fehler behoben
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.188 Beiträge
 
Delphi 2006 Professional
 
#3

AW: Batchscript zum automatischen Löschen von Dateien

  Alt 21. Mai 2019, 17:21
Super. Dank dir. Sieht gut aus.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.316 Beiträge
 
Delphi 5 Professional
 
#4

AW: Batchscript zum automatischen Löschen von Dateien

  Alt 21. Mai 2019, 18:01
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
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.296 Beiträge
 
Delphi 7 Personal
 
#5

AW: Batchscript zum automatischen Löschen von Dateien

  Alt 21. Mai 2019, 18:20
Sahne!
Hoffentlich kann ich mir den Thread merken.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.188 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Batchscript zum automatischen Löschen von Dateien

  Alt 21. Mai 2019, 18:28
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.023 Beiträge
 
Delphi 7 Professional
 
#7

AW: Batchscript zum automatischen Löschen von Dateien

  Alt 21. Mai 2019, 18:37
Sorry in der For-Schleife ist das *. absolut überflüssig bzw. kontaproduktiv. Habe es oben entfernt.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.316 Beiträge
 
Delphi 5 Professional
 
#8

AW: Batchscript zum automatischen Löschen von Dateien

  Alt 21. Mai 2019, 18:38
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

Geändert von Dalai (21. Mai 2019 um 18:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.188 Beiträge
 
Delphi 2006 Professional
 
#9

AW: Batchscript zum automatischen Löschen von Dateien

  Alt 21. Mai 2019, 18:43
Ich war gerade am debuggen. Das Script hat sich nämlich ohne was zu machen verabschiedet.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.188 Beiträge
 
Delphi 2006 Professional
 
#10

AW: Batchscript zum automatischen Löschen von Dateien

  Alt 21. Mai 2019, 18:50
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.
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von Luckie (21. Mai 2019 um 19:18 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf