fisi-azubi2010
Goto Top

Backupdateimanagement mit Bachtscript

Hallo,

Ich habe folgende Problemstellung:
Clients machen via Acronis True Image 2009 tägllich ein Differentieles Backup. Ich möchte nun das mittels der Vor- und Nachbefehlsoption von Acronis 2 Bachtfiles laufen die ein bisschen Dateimanagemend durchfüren.

Acronis erzeugt folgende filenamen:

Vollbackup: Username.tib
Differentieles Backup: Username?.tib //wobei Fragezeichen angibt das wievielte Differentiele Backup es ist.

also brauche 2 Batchfiles die folgendes bewirken:

Vor dem Backup:

Soll geprüft werden ob das letzte Differentiele Backup >= 30% der Größe des Vollbackups hat und das alte Vollbackup umbenennen in _Username.tib


Nach dem Backup:

Soll das ältere Differentielle Gelöscht werden

Content-Key: 100065

Url: https://administrator.de/contentid/100065

Printed on: April 19, 2024 at 23:04 o'clock

Member: bastla
bastla Oct 23, 2008 at 14:16:43 (UTC)
Goto Top
Hallo FISI-Azubi2010!

Nachdem wir nun wissen, was Du (für Deine Ausbildung) brauchst: Was davon hast Du schon?

Damit's ev ein wenig mehr wird: Schau Dir mit "for /?" (ziemlich am Ende des Hilfetextes) an, wie Du die Dateigröße ermitteln kannst ...

Grüße
bastla
Member: FISI-Azubi2010
FISI-Azubi2010 Oct 24, 2008 at 07:08:02 (UTC)
Goto Top
Hallo Bastla und danke für die Antwort,

Das mit dem For hab ich nicht so ganz kapiert wie sähe die Zeile aus mit der ich die Größe einer bestimmten Datei abfragen würde?

set Pfad=Netzwerkpfad\Dateiname

FOR /F " usebackq delims==" %i IN Pfad DO @echo %~zI   

???


ich habe bisher folgendes:

Für das Batch vor dem Backup:

@ECHO OFF

set Username=Beispiel

REM -----------------------------------------------------------Datei umbenennen--------------------------------------------------

RENAME Netzlaufwerkpfad\Username.tib  _Username.tib



Für das Batch nach dem Backup:

@ECHO OFF

set Username=Beispiel

REM -----------------------------------------------------------Datei löschen   --------------------------------------------------

DEL Netzlaufwerkpfad\Dateiname
Member: bastla
bastla Oct 24, 2008 at 07:30:22 (UTC)
Goto Top
Hallo FISI-Azubi2010!

wie sähe die Zeile aus mit der ich die Größe einer bestimmten Datei abfragen würde?
Die Richtung stimmt schon face-wink
set "Pfad=Netzwerkpfad\Dateiname"  
FOR %i IN ("%Pfad%") DO @echo %~zI  
oder mit Zuweisung zu einer Variablen
set "Pfad=Netzwerkpfad\Dateiname"  
FOR %i IN ("%Pfad%") DO set "Bytes=%~zI"  
@echo %Bytes%
Was Du mit der Variablen anstellen kannst, siehst Du bei "set /?" (Du wirst "set /a" benötigen), und Du solltest Dich auch für "if /?" interessieren ...

Grüße
bastla
Member: FISI-Azubi2010
FISI-Azubi2010 Oct 27, 2008 at 09:25:14 (UTC)
Goto Top
Also ich hab mir das mal angeschaut und folgende Zeilen zusammengeschuhstert.

@ECHO OFF

set /a "Pfad=Netzwerkpfad\Dateiname"   

FOR %i IN ("%Pfad%") DO set "Bytes=%~zI"   

@echo %Bytes%

Set /a Bytes2=%Bytes%/100*30

IF %Bytes% CEQ %Bytes2% DO CALL RENAME 

REM ------------------------------------------------------Datei umbenennen--------------------------------------------------
:RENAME

RENAME Netzlaufwerkpfad\Username.tib  _Username.tib

REM ------------------------------------------------------------------------------------------------------------------------

Kann ich diese Bedingung verwenden und kann man in Batch mit einer Kommazahl multiplizieren?
Member: bastla
bastla Oct 27, 2008 at 09:46:57 (UTC)
Goto Top
Hallo FISI-Azubi2010!

Hinsichtlich des "CEQ" musst Du noch einen weiteren Blick riskieren ...
Was Berechnungen unter CMD (Batch) angeht: Grundsätzlich kannst Du nur Ganzzahlen verwenden (für Dezimalstellen musst Du selbst Routinen erstellen), und daher wird es mit den 30 % nicht ganz genau gehen.

Für die Genauigkeit wäre es zwar besser, zunächst die Multiplilkation und dann erst die Division durchzuführen (da bei der Division eben nur der ganzzahlige Quotient weiter verwendet werden kann), allerdings gibt es eine Beschränkung der Genauigkeit auf 32 Bit (wovon das letzte Bit auch noch für das Vorzeichen "abgezwackt" wird, sodass die höchste positive Zahl 2^31 - 1 ist), was dazu führt, dass nur Zahlen bis 2.147.483.647 verwendet werden können - die Größe der .tib-Datei wird da vermutlich zum Problem ...

Eine Lösung dafür könnte sein, jeweiils auf die letzten 3 Stellen zu verzichten (und damit annähernd durch 1000 zu dividieren) und damit weiter zu rechnen. Das Bilden von Teilstrings ist ebenfalls in der Hilfe zu "set" zu finden.

Grüße
bastla
Member: FISI-Azubi2010
FISI-Azubi2010 Oct 28, 2008 at 08:32:50 (UTC)
Goto Top
Hallo Bastla ich hab ein weiteres Problem das früher ansetzt bei den Zeilen

set /a "Pfad=C:\Test\Username.tib"   
FOR /F %i IN ("%Pfad%") DO set "Bytes=%~zI"   

@echo %Bytes%

Bekomme ich die Fehlermeldung: "PFAD~zI" ist an dieser Stelle syntaktisch nicht verarbeitbar.

Habe das ganze dann mal Schritt für Schritt auf der Kommandozeile ausführt und folgende Zwischenmeldungen bekommen.
C:\test> set /a "Pfad=C:\Test\Username.tib"   
0
C:\test>FOR %i IN ("%Pfad%") DO set "Bytes=%~zI"   
Fehlender Operand
Member: bastla
bastla Oct 28, 2008 at 08:55:13 (UTC)
Goto Top
Hallo FISI-Azubi2010!

Das überflüssige "/a" (Du willst ja nicht mit dem Pfad rechnen) beim "set" hatte ich schon oben übersehen face-sad ...

... aber das ebenfalls nicht benötigte "/F" beim "FOR" hast Du erst heute eingebaut.

Grüße
bastla
Member: FISI-Azubi2010
FISI-Azubi2010 Oct 28, 2008 at 10:32:08 (UTC)
Goto Top
ja das war noch was ich probiert hatte so habs jetzt weitgehend hinbekommen mit der Dateigröße

ich hab jetzt folgendes:

@echo OFF

REM ----------------------------------------Ermittelung der Dateigröße des Vollbackups---------------------------
 
set "weg=C:\Test\Username1.tib"   

FOR %%F IN (%weg%) DO set "Bytes=%%~zF"   

echo %Bytes%

set prefix=1000

if %Bytes% GEQ %prefix% set "Bytes=%Bytes:~0,-3%"  

echo %Bytes% KiloByte

if %Bytes% GEQ %prefix% set "Bytes=%Bytes:~0,-3%"  

echo %Bytes% MegaByte

set groessevollbackup=%Bytes%

echo %groessevollbackup% :: Übergabevariable groessevollbackup für Vergleich voll mit differentiel

also für die Berechnung der Dateigrößen vom Differentiellen Backup könnte ich die meisten zeilen Übernehmen
Nur wie krieg ich es jetzt hin, dass die Variable weg bei jedem durchgang im Format Username?.tib um eins erhöht wird. ? gibt an das wievielte Differentielle es ist.

Ich glaube man könnte es so machen das ich nen Zähler am ende des Scriptes setze den ich dann in eine Datei schreibe und diesen Wert am anfang auslese geht das ? bzw, wie gehts geschickter?
Member: bastla
bastla Oct 28, 2008 at 22:04:47 (UTC)
Goto Top
Hallo FISI-Azubi2010!

Sieh Dir einmal die Ausgabe von
dir /b /on Username?.tib
an - vielleicht bringt Dich das auf eine Idee ("/od" könnte übrigens auch noch interessant werden).

Falls Du tatsächlich einen Wert in einer Datei zwischenspeichern wolltest, könntest Du einfach
>%Datei% echo %Wert%
zum Schreiben und
set /p Wert=<%Datei%
zum Einlesen verwenden (alternativ dazu natürlich auch per "for /f"-Schleife)

Grüße
bastla
Member: FISI-Azubi2010
FISI-Azubi2010 Oct 29, 2008 at 07:03:33 (UTC)
Goto Top
Hab rausgefunden das ich das gar nicht brauch da Acronis immer mit 1 und 2 anfängt wenn das altere umbenannt oder gelöscht wird. Deshalb hab ich das jetzt etwas anders gemacht ich führe für die beiden Dateien die Größenberechnung durch falls sie dann existieren und führe dann diese 30% berechnung aus.

Das wäre jetzt das Script das vor dem Backup ausgeführt werden soll wenn das so Funktioniert muss ich es nur noch so hinbekommen dass die Berechnung der 30% stimmt annähernd stimmt.

kannste dir ja mal anschauen:

:: Variablen mit konstanten Werten

set multiplikator=30
set prefix=1000
set teiler=100
set Username=test

::Netzlaufwerk mappen
net use y: \\ip\Test /User:test Kennwort


if exist y:\%Username%.tib goto :Vollbackup


::----------------------------------------Ermittelung der Dateigröße des Vollbackups---------------------------

:Vollbackup

set "datei=y:\%Username%.tib"   

FOR %%F IN (%datei%) DO set "Bytes=%%~zF"   

echo %Bytes%

if %Bytes% GEQ %prefix% set "Bytes=%Bytes:~0,-3%"  

echo %Bytes% KiloByte

if %Bytes% GEQ %prefix% set "Bytes=%Bytes:~0,-3%"  

echo %Bytes% MegaByte

set groessevollbackup=%Bytes%

echo %groessevollbackup% 

:: Übergabevariable groessevollbackup für Vergleich voll mit differentiel

set vergleichsgroesse=%groessevollbackup%/100
set vergleichsgroesse=%vergleichsgroesse%*30
echo %vergleichsgroesse%
::Vergleichsgröße sind die 30%

:: Abfrage ob Username1.tib nicht existiert falls ja dann gleich prüfung auf Username2.tib

if not exist y:\%Username%1.tib (goto :Diff2) Else goto :Diff1

::--------------------------------Ermittelung der Dateigröße des ersten Differentiellen Backups---------------

:Diff1

set "datei=y:\%Username%1.tib"   

FOR %%F IN (%datei%) DO set "Bytes=%%~zF"   

echo %Bytes%

if %Bytes% GEQ %prefix% set "Bytes=%Bytes:~0,-3%"  

echo %Bytes% KiloByte

if %Bytes% GEQ %prefix% set "Bytes=%Bytes:~0,-3%"  

echo %Bytes% MegaByte

set groessediffbackup=%Bytes%

echo %groessediffbackup% 


:: Übergabevariable groessediffbackup für Vergleich voll mit differentiel


if %groessediffbackup% GEQ %vergleichsgroesse% rename y:\%Username%.tib _%Username%.tib

::--------------------------------Ermittelung der Dateigröße deszweiten Differentiellen Backups---------------

if exist C:\%Username%2.tib goto :Diff2

:Diff2

set "datei=y:\%Username%2.tib"   

FOR %%F IN (%datei%) DO set "Bytes=%%~zF"   

echo %Bytes%

if %Bytes% GEQ %prefix% set "Bytes=%Bytes:~0,-3%"  

echo %Bytes% KiloByte

if %Bytes% GEQ %prefix% set "Bytes=%Bytes:~0,-3%"  

echo %Bytes% MegaByte

set groessediffbackup=%Bytes%

echo %groessediffbackup% 

:: Übergabevariable groessediffbackup für Vergleich voll mit differentiel

if %groessediffbackup% GEQ %vergleichsgroesse% rename y:\%Username%.tib _%Username%.tib


:: Netzlaufwerk entmappen

net use /delete y:


pause