ropo
Goto Top

Datensicherung per Batch

Hallo,

ich suche wieder einmal Hilfe bei der Batchprogrammierung.
Ich habe heute einen Rechner übernommen, bei dem per Win2000 eigenem Backup täglich eine Sicherung lokal erzeugt wird.
Dieses File wird damm auf ein DVD-RAM geschoben und danach lokal gelöscht.
In einem ersten Schritt möchte ich wenigstens nach dem Schreiben auf die DVD-RAM die Dateien vergleichen und je nach Errorlevel dann die Meldungen ausgeben.
Leider fällt mir dazu kein Ansatz zum Vergleichen ein, bin also für Eure Hilfe dankbar.
Im nächsten Schritt ist denkbar zu prüfen, ob anhand z.B. des Datums der letzten Änderung des Files auf der RAM überhaupt die DVD gewechselt wurde.

viele Grüße
Roland

Content-Key: 15346

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

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

Member: Biber
Biber Sep 29, 2005 at 22:26:45 (UTC)
Goto Top
Moin, ropo,

na, sooo komplex hört es sich noch nicht an.
Also, als für Deinen Fall voll ausreichendes Tool liefert M$ das Utility FC (FileCompare) mit.

FC [/A] [/C] [/L] [/LBn] [/N] [/T] [/U] [/W] [/nnnn]
[Laufwerk1:][Pfad1]Dateiname1[Laufwerk2:][Pfad2]Dateiname2
FC /B [Laufwerk1:][Pfad1]Dateiname1 [Laufwerk2:][Pfad2]Dateiname2

/A Zeigt nur die erste und letzte Zeile jedes Satzes von
Unterschieden an.
/B Führt einen binären Vergleich durch.
/C Vergleicht ohne Rücksicht auf Groß-/Kleinschreibung.
/L Vergleicht Dateien als ASCII-Textdateien.
/LBn Stellt die maximale Zahl aufeinander folgender, unterschiedlicher
Zeilen auf die angegebene Anzahl n ein.
/N Zeigt bei einem ASCII-Vergleich die Zeilennummern an.
/T Expandiert Tabulatorzeichen nicht zu Leerzeichen.
/U Vergleicht Dateien als UNICODE-Textdateien.
/W Komprimiert Tabulatoren und Leerzeichen für den Vergleichsvorgang.
/nnnn Anzahl aufeinander folgender Zeilen, die nach einem Unterschied
wieder übereinstimmen müssen.

Und, was Du in Deinem Batch brauchst: FC liefert natürlich auch ein Errorlevel von 0, wenn der Vergleich okay ist und ein Errorlevel <> 0, wenns danebenhaut.
Sicherlich sogar etwas differenzierter, aber M$'s Errorlevel sind ähnlich sauber dokumentiert wie die Beraterverträge von Bundestagsabgeordneten.. musst Du mal selber testen, welcher Errorlevel wann kommt (Dateien unterschiedlich groß, Datei1 nicht lesbar, Datei1 nicht gefunden, Datei2 nicht lesbar, Datei2 nicht gefunden, Unterschiedlicher Inhalt...)

Und mit dem Datumsvergleich, das würde ich "über Bande" machen:
Nach dem Auf-DVD-Brennen und Datei-Vergleich-ist-Okay diese (beiden) Datei-Informationen mit Name, Größe, Dateidatum meinetwegen mit "dir backupdateiname > lastbackup.log" in eine Mini-Log-Datei schreiben und deren Inhalt dann mit der neuen Dir-Information bei der nächsten Sicherung vergleichen. Bzw mit dem Dir-Output beim Einlegen der DVD.

Biber
Member: ropo
ropo Sep 30, 2005 at 12:33:17 (UTC)
Goto Top
Hallo,

erster Teil ist erledigt, war dann doch dank des Tipps recht schnell gelöst.

2.Teil
In der Logdatei steht nun z.B.
Volume in Laufwerk C: hat keine Bezeichnung.
Volumeseriennummer: 543B-CAD9

Verzeichnis von c:\dasi

30.09.2005 20:26 109.568 Backup.bkf
1 Datei(en) 109.568 Bytes
0 Verzeichnis(se), 52.750.934.016 Bytes frei

Ich möchte dieses Datum in einem getrennten Task morgens auswerten, um den Nutzern die Möglichkeit zu geben, die DVD zu wechseln.
Wie komme ich an das Datum im File, um es mit dem Tagesdatum zu vergleichen?

Gruß
Roland
Member: FlyingSader
FlyingSader Sep 30, 2005 at 21:32:07 (UTC)
Goto Top
Hallo zusammen,

ich bin grade daran ein ähnliches Skript zuschreiben, wie auch schon in meinem anderen Thread beschrieben. Den Befehl mit dem Datenvergleichen macht schon mal genau dass was ich will, aber irgendwie bekomme ich das mit den Errorlevel nicht hin. Also das er mir ne Textausgabe macht wenn es daneben geht könnte mir da jemand mal kurz was zu schreiben.

danke
Member: ropo
ropo Oct 01, 2005 at 12:07:26 (UTC)
Goto Top
Hallo,

hier der Teil des Scriptes:

start per start.vbs:
Set WshShell = WScript.CreateObject( "WScript.Shell" )
WshShell.Run "c:\Backup\Backup.cmd",0,True

Teil des Backup.cmd:
FC /B "c:\Backup\Backup.bkf" "C:\DASI\Backup.bkf"
goto L%errorlevel%
:L0
start Meldung1.bat
goto end
:L1
start Meldung2.bat
goto end:
:L2
start Meldung2.bat
goto end:
:end

meldung1.bat:
@echo off & setlocal
echo Datensicherung erfolgreich beendet!!!

Vielen Dank dabei an biber

Roland
Member: FlyingSader
FlyingSader Oct 02, 2005 at 13:42:51 (UTC)
Goto Top
Hallo zusammen,
habe das folgende Problem ich möchte gerne das alle Textdateien mit einander verglichen werden, er kontrolliert auch alle Dateien das ist nicht das Problem aber er gibt mir nur eine Textmeldung aus obwohl ich 3 Dateien zum überprüfen haben


FOR %%a in (C:\*.txt) do

fc /b C:\%%a C:\sader.\%%a

goto L%errorlevel%
:L0
echo geht >>geht.txt
goto vergleich
:L1
echo Datei nicht vorhanden >>geht.txt
goto vergleich
:L2
echo Datei nicht vorhanden >>geht.txt
goto vergleich
:vergleich
echo Kontrolle fertig >>geht.txt
Member: Biber
Biber Oct 03, 2005 at 20:36:20 (UTC)
Goto Top
nAbend ropo,

Also, denke schon, Du bekommst es auch ohne mich hin, aber ein, zwei Tipps kann ich ja noch abladen:

Teil des Backup.cmd:
FC /B "c:\Backup\Backup.bkf" "C:\DASI\Backup.bkf" >nul
call :Meldung%ErrorLevel%

:end
::--ggf Aufräumarbeiten, Abschiedsworte an der User, Logfile schreiben, Vars löschen
:: ~~~
goto :eof
::-----hier ist der Batch zu Ende. goto :eof entspricht einem RETURN

:Meldung0
echo Datensicherung erfolgreich beendet!!!
:: ein goto :eof bei einer geCALLten "Unterroutine" bedeutet :"Zurück zum Aufrufer"
goto :eof
::-
:Meldung1
echo Fehler beim Lesen der Dateien
goto :eof

:Meldung2
echo Fehler: Unterschiede beim Dateivergleich
Echo Wollen Sie jetzt weinen oder noch mal versuchen?
goto :eof
endOfThisBatch

Zu der anderen Frage (die Minilogdatei auslesen)

Die sieht ja ungefähr so aus:
Verzeichnis von c:\dasi 

30.09.2005 20:26 109.568 Backup.bkf 
1 Datei(en) 109.568 Bytes 
0 Verzeichnis(se), 52.750.934.016 Bytes frei 

Wenn das Dingen xy.log heißen würde:
type xy.log |find "backup.bkf" .... bringt Dir die wichtige Zeile...

In dieser Zeile ("30.09.2005 20:26 109.568 Backup.bkf ") sind vier mit Leerzeichen getrennte "Spalten", die Du mit dem FOR /F-Befehl einzeln rausfieseln kannst.
Also in etwa so (ungetestet, nur phantasiert) im Batch:
For /F "tokens=1-3" %%a in ('type xy.log ^|find "backup.bkf" ') do echo LastDVDDatum:%%a LastDVDZeit %%b LastDVDBytes: %%c

oder in Variablen speichern:
For /F "tokens=1-3" %%a in ('type xy.log ^|find "backup.bkf" ') do (
Set "LastDVDDatum=%%a"
set "LastDVDZeit=%%b"
set "LastDVDBytes=%%c"
)

Und entsprechend genauso, auch über den Dir-Befehl z.B die Informationen von der eingelegten DVD holen und dann vergleichen...

So in etwa wäre die Skizze,

HTH & HANN

Biber
Member: ropo
ropo Oct 04, 2005 at 06:02:55 (UTC)
Goto Top
Hallo biber,

habe den ersten Teil erfolgreich beendet.

vielen Dank für die Hilfe!

Roland
Member: Biber
Biber Oct 04, 2005 at 15:27:51 (UTC)
Goto Top
Moin FlyingSader,
sorry, hatte Deine Frage ganz übersehen, passt aber schon hier rein.
Also:
>er kontrolliert auch alle Dateien ...
aber er gibt mir nur eine Textmeldung aus obwohl ich 3 Dateien zum überprüfen habe..

Hat er auch recht mit, so hast du ihn ja losgeschickt.
Der CMD-Interpreter arbeitet zeilenweise und "kennt" auch weder die Zeile davor noch weiß er, ob und wieviele Anweisungen darin waren oder noch kommen mögen.
Und wie einer dieser glücklichen Alzheimer-Patienten erlebt er jede Zeile wieder als etwas vollkommen Neues. Beneidenswert.
Hatte ich hier irgendwo in einem Batchtutorial schon mal beschrieben.

Heißt bezogen auf die Zeile "goto L%Errorlevel%" bei Dir: Da kann er zwar den von der vorherigen Anweisung gesetzten Errorlevel prüfen, aber dass in der Vorzeile drei Anweisungen ausgeführt wurden statt einer, kann er nicht ahnen. Und auch nicht nicht wirklich begreifen.

---
(bisheriger Zustand):
FOR %%a in (C:\*.txt) do fc /b C:\%%a C:\sader.\%%a
ECHO Errorlevel des letzten FC-Befehls in der FOR-Schleife %ErrorLevel%
Goto L%ErrorLevel%

---
:: (Neu) : die eine FOR-Zeile "zerlegen" in mehrere. Erste Zeile MUSS mit DO KlammerAuf enden
:: Am Ende nicht die KlammerZu vergessen. Muss NICHT in eine Extra-Zeile, aber das macht es lesbarer.
FOR %%a in (C:\*.txt) do (
fc /b C:\%%a C:\sader.\%%a
ECHO Errorlevel des FC-Befehls in der Vor-Zeile %ErrorLevel%
Call :L%ErrorLevel%
)
:: jetzt ein CALL :Lx statt GOTO Lx ... er soll ja die Schleife weiter durchlaufen
[Edit]
Kommentare verträgt der CMD-Interpreter nicht so gut innerhalb dieser FOR-Anweisung (die ja eigentlich auch für für ihn nach wie vor eine Zeile ist).
Jedenfalls keine mit "::". Habe die Kommentarzeile deshalb unter den Schleifenkörper gesetzt. [/Edit]

Dann zeigt er Dir auch drei (oder 27) Meldungen je nach Anzahl Dateien.
HTH Biber
Member: FlyingSader
FlyingSader Oct 04, 2005 at 18:55:36 (UTC)
Goto Top
So sollte das jetzt aber doch eigentlich funktionieren, aber es tut es nicht. Er Bringt mit immer den Errorlevel 0 obwohl ich ihm völlig verschiedene Sernarien gebe und er es auch richtig erkennt.

FOR %%a in (*.txt) do (
fc /b C:\%%a C:\test\%%a
Call :L%ErrorLevel%
)

:L0
echo L0 >>geht.txt
goto vergleich
:L1
echo L1 >>geht.txt
goto vergleich
:L2
echo L2 >>geht.txt
goto vergleich
:vergleich
echo Kontrolle fertig >>geht.txt

Grüsse Thorsten
Member: ropo
ropo Oct 04, 2005 at 18:59:46 (UTC)
Goto Top
Hallo Biber,

habe am 2.Teil gearbeitet und noch folgende Fragen:
"tokens=1-3 delims= " Ergänzung durch Trennzeichen Leerzeichen ist sicherlich ok.
Wenn ich nur nach dem Dateinamen abfrage erfolgt die korrekte Ausgabe aller Zeilen
('type xy.log ^|find "backup.bkf" ') bringt bei mir keine Auswertung, finde aber in der Hilfe keinen Hinweis auf einen Syntaxfehler.
Was bedeutet eigentlich ^?

Gruß
Roland
Member: Biber
Biber Oct 05, 2005 at 10:08:22 (UTC)
Goto Top
@FlyingSader

die einzelnen ge CALLten Bläcken müssen mit "goto :eof" abgeschlossen sein.
Dann sollte es tun, was Du willst.

:L0
echo L0 >>geht.txt
goto :eof ....(also zurück in die FOR-Schleife)

Gruß
Biber
Member: Biber
Biber Oct 05, 2005 at 10:13:00 (UTC)
Goto Top
Hallo ropo,

"tokens=1-3 delims= "
Ergänzung durch Trennzeichen Leerzeichen ist sicherlich ok.
Schadet nichts, ist aber ohnehin Default. Ist ok.


Wenn ich nur nach dem Dateinamen abfrage
erfolgt die korrekte Ausgabe aller Zeil('type xy.log ^|find "backup.bkf"') bringt bei mir keine Auswertung, finde
aber in der Hilfe keinen Hinweis auf einen Syntaxfehler.
Hab ich nicht verstanden, formulier mal bitte um.. *ratlos guckt

Was bedeutet eigentlich ^?

^ ist eine "Maskierung" des darauffolgenden Sonder- oder Steuerzeichens. Habe ich in einem der Batch-Tutorials mal beschrieben.
Geh mal in "Batch & Shell."

Gruß Biber
Member: ropo
ropo Oct 05, 2005 at 10:21:37 (UTC)
Goto Top
Hallo,

alles ok.

Vielen Dank für die Hilfe.

Roland
Member: Biber
Biber Oct 05, 2005 at 17:59:32 (UTC)
Goto Top
Moin FlyingSader,

sorry, Denkfehler von mir.
Ich hätte mein eigenes Geschwafel oben lesen sollen, dann hätte ich es gemerkt..*gg

Ich habe es ja selbst geschrieben, der CMD-Interpreter nimmt diese For-Anweisung

FOR %%a in (*.txt) do (
fc /b C:\%%a C:\test\%%a
Call :L%ErrorLevel%
)


als eine Anweisung, als eine Zeile entgegen und führt sie dann aus.
Heißt natürlich, dass er auch, wenn er die -für ihn eine- Anweisung ausführt, natürlich alle darin enthaltenen "normalen*" Variablen auflöst. Einmal auflöst. Nicht bei jeder FOR-Runde..
Auch den %Errorlevel%.......... *sichvornKoppklatscht

(*Außer den Zählvariablen %%a....%%c... die löst er automatisch immer aktuell auf )

Zwei Umgehungsstrategien:
a) die Errorlevel-Abfrage außerhalb der "einen" Zeile legen

FOR %%a in (*.txt) do (
fc /b C:\%%a C:\test\%%a
Call :CheckErrlevel
)

:ChkErrlevel
call :L%ErrorLevel%
goto :eof
...(zurück in die FOR-Schleife)

b)
..oder aber den CMD-Interpreter zur "verspäteten Variablenauflösung" zwingen.
Vor der FOR-Schleife schreiben:

Setlocal EnableDelayedExpansion

und die Variablen, die "verspätet" aufgelöst werden sollen, in Ausrufe-Zeichen statt in Prozentzeichen eingebettet schreiben.
Also z.B. !var! statt %var% oder bei Dir im Batch !ErrorLevel! statt %ErrorLevel%
FOR %%a in (*.txt) do (
fc /b C:\%%a C:\test\%%a
Call :L!ErrorLevel!
)


Sieht zwar ein bisschen kryptisch aus, aber nach zweimal lesen versteht man/frau es.

Unter "set /? " hat M$ versucht, diese Mimik zu erklären. Bitte lies es da noch mal nach.
Ich bin nicht so gut im Erklären. [Edit am 9.10.05] Habe deshalb noch mal oben stilistisch geändert. Sonst eben mehrmals lesen. [/Edit]

HTH Frank / der Biber aus Bremen

P.S. Diesmal schreibe ich es dazu: Ist nur eine ungetestete Skizze! face-wink
P.P.S. Ich wäre übrigens dankbar, wenn entweder einer von Euch beiden einen neuen Thread aufmacht, ...
... oder (noch besser) vielleicht auch mal ein paar andere ihre Lösungsvorschläge posten könnten. Ich bin dich nicht der einzige hier, der ein bisschen Batch spricht..