Batch Script zum kopieren von Backups mit Speicherkontrolle

epytir

Newbie
Dabei seit
Juni 2014
Beiträge
7
Hallo Community,
ich arbeite mal wieder an einem Backup Script .
Es soll solange immer die neuesten Dateien kopieren bis die Festplatte voll ist. Wenn dies passiert soll es die älteste Datei löschen und weiterkopieren.
So weit bin ich bisher :
Code:
@echo on
::Nur Testpfade
SET Quelle=C:\Users\Public\Pictures\Sample Pictures
SET Ziel=C:\Users\TEMP\Pictures\test

SETLOCAL ENABLEDELAYEDEXPANSION
for /f "tokens=3" %%i in ('dir C: /-c') do set Festplattenplatz=%%i
for /F "tokens=*" %%f in ('dir /b %Quelle%\*.*') do set AKTJOB=%%f
for %%F in (%Quelle%\%AKTJOB%) do set groesse=%%~zF

if %Festplattenplatz% GTR %groesse% (CALL :Dateipasst)
if %Festplattenplatz% LSS %groesse% (CALL :Plattevoll)
goto start

:Dateipasst
echo %Quelle%\%AKTJOB%
xcopy "%Quelle%\%AKTJOB%" %Ziel% 
goto End

:Plattevoll
echo Platte voll
for /f "delims=" %%i in ('dir /b /a-d /o-d "%Ziel%"') do set "Alt=%Ziel%\%%i"
del "%Alt%"
goto End


:Fertig
echo. & echo == Fertig ==
pause > NUL
goto End

:End
Das löschen der ältesten Datei klappt super und auch.
Mein Problem ist das die Backups nur kopiert werden sollen das heißt mein Programm nimmt immer die selbe Datei kopiert diese , wenn der Speicher reicht und nimmt dann wieder die erste Datei also eine Endlosschleife... Gibt es eine Möglichkeit das er nicht immer die selbe Datei abfragt.
Ich habe schon überlegt mit dem Archivbit zu spielen also kopieren Archivbit entfernen und dann alle Dateien wo es entfernt wurde nicht kopieren aber das wollte so gar nicht zusammen mit meiner Speicherabfrage funktionieren.

hoffe jemand kann mir helfen.
Gruß Epytir
 

DerTiger

Ensign
Dabei seit
Jan. 2006
Beiträge
191
Hi,

kurze Zwischenfrage: Wäre es nicht gut du würdest für das selbe Script auch den selben Thread benutzen? Das ist doch jetzt schon der dritte Thread zu dem Thema?

Dein Problem ist:

das Script durchläuft alle 3 schleifen separat, und erst dann machst du die abfrage auf Größe und Platz.

erste schleife ermittelt platz
zweite schleife übergibt alle dateien an aktjob, nur die letzte datei wird darin gespeichert.
dritte schleife ermittelt für die letzte übergebene datei die größe.

JETZT kommt erst die abfrage ob größer oder kleiner, und dann springst du zum copy.

m.M.n musst du die reihenfolge ändern.

Erst eine Datei auswählen (schleife 2,) die größe der gewählten datei ermitteln (schleife 3), in dieser den aktuellen festplattenplatz abfragen (schleife 1), und dann die größe der gewählten datei damit vergleichen. Erst dann die schleife zu machen.

Das goto start funktioniert nicht, weil die schleife danach wieder von vorne bis hinten durch läuft, und immer die selbe letzte datei ergibt. Damit das so funktioniert wie es jetzt da steht müsstest du zumindest mit einem Move arbeiten, dann ist die datei weggeschoben und taucht natürlich nicht wieder auf.
 

Twostone

Captain
Dabei seit
Dez. 2013
Beiträge
3.179
Der Einfachheit halber würde ich ein solches Script folgendermaßen strukturieren:

1) Liste der zu kopierenden Dateien ermitteln und in einem Array oder einer temporären Datei speichern
2) Platzbedarf für alle Dateien ermitteln
3) verfügbaren Speicherplatz ermitteln
4) Bedarf und Bestand vergleichen und ggf. abbrechen
5) Liste abarbeiten.

Möchtest Du tatsächlich, daß für jede Datei geschaut wird, ob sie passt, würde ich den verfügbaren Platz einmal auslesen und in einer Variable speichern, von der jeweils die Größe der zuvor kopierten Datei abgezogen wird. Alle n-Male kann man die Variable prüfen, aber für tausende von Dateien jedes Mal den verfügbaren Speicherplatz abzufragen, könnte den Kopiervorgang unnötig in die Länge ziehen, insbesondere dann, wenn es sich um einen nicht-lokalen Datenträger handelt.
Also:

.Zu Beginn festlegen, bei wie vielen Durchgängen die Variable überprüft werden muß und dies als aktuellen Wert setzen
.Liste der zu kopierenden Dateien erstellen
.Für jede Datei der Liste; führe aus
...Muß die Variable überprüft werden; dann
......verfügbaren Speicherplatz ermitteln und in Variable packen
......Setze Anzahl der Durchgänge auf 0
...fi
...Wenn Dateigröße < Speicherplatz; dann
......kopiere Datei
......Bei Fehler abbruch
......Ziehe Dateigröße von Variable ab
......erhöhe Anzahl der Durchgänge um 1
...sonst
......Fehlermeldung ausgeben oder in logfile schreiben
...fi
.done
.ggf. temporäre Datei löschen

In bash oder zsh könnte ich Dir das Script ausformulieren. Batch ist unelegant und viel zu lange her.
 
Zuletzt bearbeitet:

DerTiger

Ensign
Dabei seit
Jan. 2006
Beiträge
191
mmmh... also, ich glaube windows hat ohne weiteres keine unterstützung für bash/zsh. *hust*
 

Twostone

Captain
Dabei seit
Dez. 2013
Beiträge
3.179
cygwin macht's möglich. Das vorgeschlagene Konzept sollte allerdings auch in Batch realisierbar sein, nur würde ich's nicht schreiben wollen, da es sich in Batch nicht sonderlich gut liest und Knoten im Hirn verursacht. ;)
 
Top