Delphi-PRAXiS

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.

Delphi.Narium 21. Mai 2019 19:26

AW: Batchscript zum automatischen Löschen von Dateien
 
Deine Verzeichnisse fangen doch alle irgendwie mit 2 an (Jahreszahl).

Ergänze mal das Dir um 2*.*, damit die anderen Verzeichnisse nicht mit ausgegeben werden, davon willst Du ja auch (höchstwahrscheinlich) nix löschen.

Ein im realen Leben ausgeführtes
Code:
rmdir /S /Q "D:\\System Volume Information"
käme vermutlich nicht so gut :-(

Eventuell
Code:
@echo off
rem Anzahl der Verzeichnisse, die uebrig bleiben sollen?
set RETAINBACKUPS=15
rem ohne Backslash am Ende, der wird später mit den Verzeichnisnamen angehängt.
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-r-s-h /O-D 2*.* "%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

Dalai 21. Mai 2019 19:31

AW: Batchscript zum automatischen Löschen von Dateien
 
Backup im Root eines Laufwerks hatte ich auch noch nicht. Das sollte recht einfach zu beheben sein, wenn du die Syntax deiner Verzeichnisse mit einbeziehst:
Code:
... IN ('dir /B /AD /O-D "%BACKUPDIR%\*-*-* *-*" 2^>NUL') ...
Übrigens lässt sich "System Volume Information" nur mit SYSTEM-Rechten betreten und daher auch mit Adminrechte nicht löschen. Nichtsdestotrotz ist es natürlich besser, wenn das erst gar nicht beachtet wird.

Grüße
Dalai

Luckie 21. Mai 2019 19:32

AW: Batchscript zum automatischen Löschen von Dateien
 
Ausgangssituation:
Code:
2019-05-10 13-41
2019-05-18 13-41
2019-05-21 13-41
Mit
Code:
@echo off
set RETAINBACKUPS=1
set BACKUPDIR=D:\

if not exist "%BACKUPDIR%" (
    echo.
    echo "%BACKUPDIR%" existiert nicht.
    echo.
    pause
    goto :EOF
)

rem freien Speicherplatz anzeigen
for /f "tokens=3" %%i in ('dir /-c^|findstr /c:"Bytes frei"') do set tmp=%%i
echo Freier Speicherplatz auf Laufwerk D: %tmp:~0,3% GB
echo.

rem alte Backups loeschen
choice /M "Alte Sicherung(en) loeschen?" /C JN
if %ERRORLEVEL% == 1 goto DEL_OLDEST
if %ERRORLEVEL% == 2 goto DO_BACKUP

:DEL_OlDEST
echo Loesche alte Sicherungen...
echo.

for /F "skip=%RETAINBACKUPS% delims=" %%F IN ('dir /B /AD-r-s-h /O-D 2*.* "%BACKUPDIR%" 2^>NUL') DO (
    echo rmdir /S /Q "%BACKUPDIR%\%%F"
)

pause
...bekomme ich:
Code:
Freier Speicherplatz auf Laufwerk D: 833 GB

Alte Sicherung(en) loeschen? [J,N]?J
Loesche alte Sicherungen...

rmdir /S /Q "D:\\2019-05-18 13-41"
rmdir /S /Q "D:\\2019-05-10 13-41"
rmdir /S /Q "D:\\2019-05-10 13-41"
rmdir /S /Q "D:\\2019-05-21 13-41"
rmdir /S /Q "D:\\2019-05-21 13-41"
Drücken Sie eine beliebige Taste . . .
Ächtz.

Er soll fünf behalten, es sind drei vorhanden und er will die neuste Sicherung zwei mal löschen.

Dalai 21. Mai 2019 20:31

AW: Batchscript zum automatischen Löschen von Dateien
 
Weiß nicht, ob mein Beitrag von 20:31 übersehen wurde. Mit dem dort gegebenen Pattern sollte es klappen.

Grüße
Dalai

Delphi.Narium 21. Mai 2019 21:13

AW: Batchscript zum automatischen Löschen von Dateien
 
Das Problem scheint aber nicht das Pattern zu sein, sondern die doppelte Aufführung der Verzeichnisse im Dir-Ergebnis.

Es werden alle Verzeichnisse zwei mal ausgegeben und davon wird dann das Erste übersprungen.

3 Verzeichnisse * 2 = 6 minus dem 1. = 5 Verzeichnisse in der Ausgabe.

Wie sieht das Ergebnis von
Code:
for /F "skip=%RETAINBACKUPS% delims=" %F IN ('dir /B /AD-r-s-h /O-D "%BACKUPDIR%\2???-??-?? ??-??"') DO echo rmdir /S /Q "%BACKUPDIR%\%F"
auf der Kommandozeile aus?

Dalai 21. Mai 2019 21:16

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

Zitat von Delphi.Narium (Beitrag 1432768)
Das Problem scheint aber nicht das Pattern zu sein, sondern die doppelte Aufführung der Verzeichnisse im Dir-Ergebnis.

Was aber nur mit deinem Befehl passiert, weil du dem dir-Kommando zwei Verzeichnisse übergibst. Wenn es das erste nicht gibt, kommt stattdessen "Datei nicht gefunden" als Fehlermeldung (die dann vom 2>NUL geschluckt wird).

Grüße
Dalai

Luckie 21. Mai 2019 21:18

AW: Batchscript zum automatischen Löschen von Dateien
 
Erst muss ich mein Windows wieder zu Laufen bringen. Nach einem Windows Update ist er bei der Konfiguration des Updates hängen geblieben.

Luckie 21. Mai 2019 21:23

AW: Batchscript zum automatischen Löschen von Dateien
 
Mit
Code:
for /F "skip=%RETAINBACKUPS% delims=" %%F IN ('dir /B /AD-r-s-h /O-D *-*-* *-* "%BACKUPDIR%" 2^>NUL') DO (
    echo rmdir /S /Q "%BACKUPDIR%\%%F"
)
bekomme ich:
Code:
Alte Sicherung(en) loeschen? [J,N]?J
Loesche alte Sicherungen...

rmdir /S /Q "D:\\2019-05-18 13-41"
rmdir /S /Q "D:\\2019-05-18 13-41"
rmdir /S /Q "D:\\2019-05-10 13-41"
rmdir /S /Q "D:\\2019-05-10 13-41"
rmdir /S /Q "D:\\2019-05-10 13-41"
rmdir /S /Q "D:\\2019-05-21 13-41"
rmdir /S /Q "D:\\2019-05-21 13-41"
rmdir /S /Q "D:\\2019-05-21 13-41"
Drücken Sie eine beliebige Taste . . .
bei: set RETAINBACKUPS=1

Mit 2???-??-?? ??-?? findet er gar nichts.

Dalai 21. Mai 2019 21:48

AW: Batchscript zum automatischen Löschen von Dateien
 
Deswegen schrieb ich ja das Pattern hinter das %BACKUPDIR%. Siehe Beitrag #12.

Grüße
Dalai

Luckie 21. Mai 2019 21:49

AW: Batchscript zum automatischen Löschen von Dateien
 
Autsch. Ganz übersehen.

Delphi.Narium 21. Mai 2019 21:52

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

Zitat von Dalai (Beitrag 1432769)
Zitat:

Zitat von Delphi.Narium (Beitrag 1432768)
Das Problem scheint aber nicht das Pattern zu sein, sondern die doppelte Aufführung der Verzeichnisse im Dir-Ergebnis.

Was aber nur mit deinem Befehl passiert, weil du dem dir-Kommando zwei Verzeichnisse übergibst. Wenn es das erste nicht gibt, kommt stattdessen "Datei nicht gefunden" als Fehlermeldung (die dann vom 2>NUL geschluckt wird).

Grüße
Dalai

Das zweite Verzeichnis im Dir hast Du mit Post Nr. #4 eingeführt. Seit dem schleppt sich das irgendwie mit durch, obwohl es syntaktisch eher grenzwertig ist.

Noch ein Versuch ohne die überflüssige Klammerung für die Kommandozeile:
Code:
for /F "skip=1 delims=" %F IN ('dir /B /AD-r-s-h /O-D "%BACKUPDIR%\*-*-* *-*" 2^>NUL') DO echo rmdir /S /Q "%BACKUPDIR%\%F"
Der Dir-Befehl verlangt keine zwei Parameter, das %BACKUPDIR% hinter dem Pattern für die Verzeichnisnamen ist kontraproduktiv.

Luckie 21. Mai 2019 21:56

AW: Batchscript zum automatischen Löschen von Dateien
 
Keine Ausgabe mit:
Code:
@echo off
set RETAINBACKUPS=1
set BACKUPDIR=D:\

if not exist "%BACKUPDIR%" (
    echo.
    echo "%BACKUPDIR%" existiert nicht.
    echo.
    pause
    goto :EOF
)

rem freien Speicherplatz anzeigen
for /f "tokens=3" %%i in ('dir /-c^|findstr /c:"Bytes frei"') do set tmp=%%i
echo Freier Speicherplatz auf Laufwerk D: %tmp:~0,3% GB
echo.

rem alte Backups loeschen
choice /M "Alte Sicherung(en) loeschen?" /C JN
if %ERRORLEVEL% == 1 goto DEL_OLDEST
if %ERRORLEVEL% == 2 goto DO_BACKUP

:DEL_OlDEST
echo Loesche alte Sicherungen...
echo.

for /F "skip=%RETAINBACKUPS% delims=" %%F IN ('dir /B /AD-S /O-N "%BACKUPDIR%\*-*-* *-*" 2^>NUL') DO (
    echo rmdir /S /Q "%BACKUPDIR%\%%F"
)

pause

Dalai 21. Mai 2019 22:00

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

Zitat von Delphi.Narium (Beitrag 1432777)
Das zweite Verzeichnis im Dir hast Du mit Post Nr. #4 eingeführt.

Wo ist da ein zweites Verzeichnis? Kommando dir, danach ein paar Switches dafür und danach das BACKUPDIR. Dann Fehlerumleitung samt notwendigem Escaping.

Zitat:

ohne die überflüssige Klammerung für die Kommandozeile
Bei einem einzelnen Befehl wie hier mag sie überflüssig sein, aber sobald man weitere Befehle hinzufügen will, und sei es nur für die Ausgabe, ist die Klammerung notwendig. Zudem finde ich es mit Klammerung viel einfacher zu lesen.

Zitat:

Der Dir-Befehl verlangt keine zwei Parameter, das %BACKUPDIR% hinter dem Pattern für die Verzeichnisnamen ist kontraproduktiv.
Sag ich ja. Aber ich hab an keiner Stelle mehrere Verzeichnisse angegeben gehabt.


Zitat:

Zitat von Luckie (Beitrag 1432779)
Keine Ausgabe mit

Du musst dir die Attribute der Verzeichnisse genau anschauen und die dir-Schalter entsprechend anpassen.

Grüße
Dalai

Delphi.Narium 21. Mai 2019 22:01

AW: Batchscript zum automatischen Löschen von Dateien
 
Ergebnis Kommandozeile ohne Klammerung?

Luckie 21. Mai 2019 22:04

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

Code:
@echo off
set RETAINBACKUPS=2
set BACKUPDIR=D:\
d:

if not exist "%BACKUPDIR%" (
    echo.
    echo "%BACKUPDIR%" existiert nicht.
    echo.
    pause
    goto :EOF
)

rem freien Speicherplatz anzeigen
for /f "tokens=3" %%i in ('dir /-c^|findstr /c:"Bytes frei"') do set tmp=%%i
echo Freier Speicherplatz auf Laufwerk D: %tmp:~0,3% GB
echo.

rem alte Backups loeschen
choice /M "Alte Sicherung(en) loeschen?" /C JN
if %ERRORLEVEL% == 1 goto DEL_OLDEST
if %ERRORLEVEL% == 2 goto DO_BACKUP

:DEL_OlDEST
echo Loesche alte Sicherungen...
echo.

for /F "skip=%RETAINBACKUPS% delims=" %%F IN ('dir /B /AD-S /O-N "*" 2^>NUL') DO (
    echo rmdir /S /Q "%BACKUPDIR%\%%F"
)

pause
So funktioniert es.

Delphi.Narium 21. Mai 2019 22:10

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

Zitat von Dalai (Beitrag 1432780)
Zitat:

Zitat von Delphi.Narium (Beitrag 1432777)
Das zweite Verzeichnis im Dir hast Du mit Post Nr. #4 eingeführt.

Wo ist da ein zweites Verzeichnis? Kommando dir, danach ein paar Switches dafür und danach das BACKUPDIR. Dann Fehlerumleitung samt notwendigem Escaping.

Oohh, Mist, Du hast recht, sollte wohl mal meine Brille putzen und nicht immer nur das lesen, von dem ich meine das es irgendwo steht, sondern nur das, was da wirklich steht.

Zitat:

Zitat von Dalai (Beitrag 1432780)
Zitat:

ohne die überflüssige Klammerung für die Kommandozeile
Bei einem einzelnen Befehl wie hier mag sie überflüssig sein, aber sobald man weitere Befehle hinzufügen will, und sei es nur für die Ausgabe, ist die Klammerung notwendig. Zudem finde ich es mit Klammerung viel einfacher zu lesen.

Prinzipiell hast Du ja recht, aber auf der Kommandozeile ist das halt schwer testbar. Wenn was in 'ner Batchdatei nicht so funktioniert, probier' ich das alles einzeln auf der Kommandozeile. In der Batchdatei kann man es dann in der Klammerung zusammenfassen.

Zitat:

Zitat von Dalai (Beitrag 1432780)
Zitat:

Der Dir-Befehl verlangt keine zwei Parameter, das %BACKUPDIR% hinter dem Pattern für die Verzeichnisnamen ist kontraproduktiv.
Sag ich ja. Aber ich hab an keiner Stelle mehrere Verzeichnisse angegeben gehabt.

Sorry, da hab' ich irgendwie vollkommen falsch geguckt.

Dalai 21. Mai 2019 22:15

AW: Batchscript zum automatischen Löschen von Dateien
 
Ja, man kann auch ein
Code:
cd /D "%BACKUPDIR%"
vorneweg machen, aber trotzdem funktioniert es nach meinen Tests auch, das Pattern direkt an das dir-Kommando zu geben.

Vielleicht war das Wegfiltern der Fehler für die Tests doch nicht so gut? Andererseits lässt sich ja das dir-Kommando auch so auf die CMD kopieren und einzeln testen (dann sinnvollerweise ohne Umleitung von StdError) ...

Grüße
Dalai

Luckie 21. Mai 2019 22:20

AW: Batchscript zum automatischen Löschen von Dateien
 
Egal. Jetzt funktioniert es jedenfalls.

Vielen Dank für eure Hilfe.

Dalai 22. Mai 2019 03:40

AW: Batchscript zum automatischen Löschen von Dateien
 
Auf eine Sache möchte ich in Bezug auf das fehlende bzw. breit gefasste Pattern noch hinweisen: Damit werden alle Verzeichnisse ausgegeben, nicht nur die automatisch erstellten Backupverzeichnisse. Achte also darauf, dass dort keine anderen Dinge rumliegen, sonst wunderst du dich, wenn auf einmal Verzeichnisse bzw. ganze Strukturen verschwinden. Auch deshalb ist es besser, sowohl ein Pattern anzugeben, als auch in ein Verzeichnis zu sichern, das ausschließlich für Backups gedacht ist (und sonst nichts rumgeschrieben wird).

Zitat:

Prinzipiell hast Du ja recht, aber auf der Kommandozeile ist das halt schwer testbar.
Wieso? Auch auf diese Art geklammerte Bereiche lassen sich exakt so in die CMD einfügen. Man muss nur darauf achten, die doppelten Prozentzeichen von for-Schleifen u.ä. in einfache zu wandeln, das war's. Klammern stören nicht, ganz im Gegenteil: Wenn eine öffnende Klammer eingegeben wird, weist die CMD darauf hin mit dem "Mehr?", dass man die Eingabe fortsetzen kann/soll, bis zur schließenden Klammer.

Grüße
Dalai

Luckie 22. Mai 2019 04:20

AW: Batchscript zum automatischen Löschen von Dateien
 
Das ist schon in Ordnung. Auf dem Laufwerk kommen nur Backups. Sie hat auch die Bezeichnung "Backup". Da noch mal einen Unterordner "Backup" anzulegen wäre unsinnig.

DenkDirNix 22. Mai 2019 07:19

AW: Batchscript zum automatischen Löschen von Dateien
 
Liste der Anhänge anzeigen (Anzahl: 1)
Fürs Debuggen von Batch-Dateien hatte ich mal einen Debugger im Delphi-Stil geschrieben, siehe https://www.dropbox.com/sh/k34v4uhwd...HdEMM4I4a?dl=0. Sollte für unsereiner also einigermaßen intuitiv bedienbar sein. Soweit man so etwas über die Gattung "Debugger" überhaupt sagen kann.

Der hilft bei Problemen mit der Befehls-Syntax natürlich eher weniger, ist aber gut bei der Verfolgung des Programmflusses und der Variablen-Inhalte.

Luckie 22. Mai 2019 09:26

AW: Batchscript zum automatischen Löschen von Dateien
 
Oh. Das klingt gut. Beim nächsten mal. :-D

bra 22. Mai 2019 13:07

AW: Batchscript zum automatischen Löschen von Dateien
 
Je nach Datenmenge ist das ganze aber ziemlich uneffizient, weil jedes mal alles in das Unterverzeichnis kopiert wird und die überzähligen Verzeichnisse komplett gelöscht werden.

Der Vorteil von robocopy ist ja gerade, dass er Verzeichnisse quasi synchronisieren kann (inkl. Löschen von nicht mehr vorhandenen Dateien).

Wäre es nicht sinnvoller, x feste Verzeichnisse anzulegen und über robocopy abhängig vom Tag da jeweils reinzukopieren?

Luckie 22. Mai 2019 14:02

AW: Batchscript zum automatischen Löschen von Dateien
 
Ich wollte keine Synchronisation. Das passt schon so für mich, wie ich es jetzt habe.

Luckie 23. Mai 2019 08:59

AW: Batchscript zum automatischen Löschen von Dateien
 
Der Vollständigkeit halber hier das vollständige Script für alle die es brauchen:

Code:
@echo off

rem Projekt         : Backupskript NAS auf Zeus
rem Autor         : Michael Puff <mail@michael-puff.de>
rem Datum         : 2019-05-21

set RETAINBACKUPS=4
set h=%time:~0,2%
set m=%time:~3,2%
Set CTIME=%h%-%m%
echo ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
echo º                                                          º
echo º                      NAS Backup                         º
echo º                      ÍÍÍÍÍÍÍÍÍÍ                          º
echo º                                                          º
echo ÌÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĹ
echo º                                                          º
echo º             Sichert Daten vom Herakles (NAS)            º
echo º        nach Zeus (PC Michael) auf Backup Laufwerk D.    º
echo º                                                          º
echo ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
echo.

rem freien Speicherplatz anzeigen
for /f "tokens=3" %%i in ('dir /-c^|findstr /c:"Bytes frei"') do set tmp=%%i
echo Freier Speicherplatz auf Laufwerk D: %tmp:~0,3% GB
echo.

rem alte Backups loeschen
choice /M "Alte Sicherung(en) loeschen?" /C JN
if %ERRORLEVEL% == 1 goto DEL_OLDEST
if %ERRORLEVEL% == 2 goto DO_BACKUP

:DEL_OLDEST
echo.
echo Loesche alte Sicherungen...
echo.

for /F "skip=%RETAINBACKUPS% delims=" %%F IN ('dir /B /AD-S /O-N "*" 2^>NUL') DO (
  echo Loesche %%F
  rmdir /S /Q "d:\%%F"
)

:DO_BACKUP
echo.
echo Sicherung beginnen..
echo.
rem VC Container trennen
echo VC Container "Dokumente" trennen...
veracrypt /d /l y /f /q

echo.

rem Sicherung beginnen
md "D:\%date% %CTIME%
robocopy "Z:" "D:\%date% %CTIME%" /MIR /A-:A /XD "Z:\#recycle" /V
attrib "D:\%date% %CTIME%" /S /D -S -H
echo.

Pause

Dalai 23. Mai 2019 19:35

AW: Batchscript zum automatischen Löschen von Dateien
 
Bei diesem Code musst du aber sicherstellen, dass das Arbeitsverzeichnis immer gleich dem Backupverzeichnis ist, denn das dir-Kommando listet die Inhalte vom Arbeitsverzeichnis, gelöscht wird aber in einem konkreten Pfad (dem Backupverzeichnis).

Wollt's nur nochmal gesagt haben, auch für andere Mitleser.

PS: Bei dem md unten im Skript fehlt das schließende Quote.

Grüße
Dalai

Luckie 23. Mai 2019 20:23

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

Zitat von Dalai (Beitrag 1432993)
Bei diesem Code musst du aber sicherstellen, dass das Arbeitsverzeichnis immer gleich dem Backupverzeichnis ist, denn das dir-Kommando listet die Inhalte vom Arbeitsverzeichnis, gelöscht wird aber in einem konkreten Pfad (dem Backupverzeichnis).

Wollt's nur nochmal gesagt haben, auch für andere Mitleser.

PS: Bei dem md unten im Skript fehlt das schließende Quote.

Danke für den Hinweis. Am Anfang noch ein D: ?

Dalai 23. Mai 2019 21:12

AW: Batchscript zum automatischen Löschen von Dateien
 
Diese Möglichkeiten hast du:
Code:
cd /D D:\
D:
pushd D:\
wobei bei letzterem am Ende noch ein popd zu ergänzen wäre (wenn auch nicht zwingend nötig). Es gibt subtile Unterschiede zwischen den Kommandos. Ersteres ändert spezifisch auf das Root von Laufwerk D:, zweiteres wechselt nur auf Laufwerk D: und zwar in das zuletzt dort benutzte Verzeichnis. Und das pushd packt das Verzeichnis auf den Verzeichnisstack und kann als einziges mit UNC-Pfaden umgehen (indem es selbigen als Netzlaufwerk mappt).

Im Kontext des Skriptes (im oben geposteten) Stand ist das Ergebnis aller drei Varianten aber gleich.

Grüße
Dalai

Luckie 23. Mai 2019 21:16

AW: Batchscript zum automatischen Löschen von Dateien
 
Dann werde ich die erste Möglichkeit nehmen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 Uhr.

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