43497
Goto Top

Robocopy Logfile auswerten

Hallo zusammen! Bin recht neu hier und hoffe, dass ihr mir helfen könnt.

Es geht um Robocopy. Dies kopiert Daten von einer NAS-Station auf eine mobile NAS-Einheit und erstellt dann ein Logfile auf der mobilen Einheit.
Ich denke dass einige hier wissen wie das Logfile von Robocopy aussieht, für den unerfahrenen Anweder nicht gerade Benutzerfreundlich...

Nun habe ich in die Robocopy-Batchdatei Zeilen eingefügt, dass auf dem Desktop eine Kurzform des Logfiles erstellt wird.
Gäbe es die Möglichkeit das original Logfile danach zu durchsuchen (vorallem nur die letzten X Zeilen, da das Logbuch angehängt und nicht überschrieben wird), dass bei FAILED 0 steht ?? Dadurch dass es so tabellenförmig angeordnet ist komme ich leider nicht weiter...

Wenn FAILED = 0, ist es dann möglich ein Popup zu erstellen mit z.B. dem Text "Kopiervorgang erfolgreich" bzw. wenn FAILED >=1 "Kopiervorgang nicht erfolgreich" ??

Danke schonmal für die Hilfe!

Mit freundlichen Grüßen
Dominik Fischer

Content-Key: 51629

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

Ausgedruckt am: 29.03.2024 um 13:03 Uhr

Mitglied: bastla
bastla 14.02.2007, aktualisiert am 18.10.2012 um 18:31:39 Uhr
Goto Top
Hallo DFischer und willkommen im Forum!

Das Thema hatten wir vor einiger Zeit (siehe hier) - vielleicht hilft Dir das ...

Grüße
bastla
Mitglied: 43497
43497 14.02.2007 um 10:18:47 Uhr
Goto Top
Hallo und danke für die Hilfe!

Hab jetzt den Code
'CheckRobocopyLog.vbs  
Const sLogFile = "D:\CD\Extern1\RoboCopy.log"  
Const sMarker = "     Dirs :" 'Kennzeichen am Zeilenanfang  
Const sOK = "Sicherung erfolgreich."  
sMarkLen = Len(sMarker)
Set fso = WScript.CreateObject("Scripting.FileSystemObject")  
Set oLogFile = fso.OpenTextFile(sLogFile, 1)
Do While Not oLogFile.AtEndOfStream
    sLine = oLogFile.ReadLine
    If Left(sLine, sMarkLen) = sMarker Then
        sValues = Trim(Mid(sLine, sMarkLen + 1)) 'hinter Kennzeichen befinden sich die Werte  
        Exit Do 'weitere Zeilen nicht mehr untersuchen  
    End If
Loop
oLogFile.Close

'Auswertung  
If sValues <> "" Then  
    sMsg = sOK
    iPos = Instr(sValues, " ")  
    If iPos > 1 Then
        iTotal = CInt(Left(sValues, iPos - 1))
    End If
    sValues = Trim(Mid(sValues, iPos))
    iPos = Instr(sValues, " ")  
    If iPos > 1 Then
        iCopied = CInt(Left(sValues, iPos - 1))
    End If
    sValues = Trim(Mid(sValues, iPos))
    iPos = Instr(sValues, " ")  
    If iPos > 1 Then
        iSkipped = CInt(Left(sValues, iPos - 1))
    End If
    sValues = Trim(Mid(sValues, iPos))
    iPos = Instr(sValues, " ")  
    If iPos > 1 Then
        iMismatch = CInt(Left(sValues, iPos - 1))
    End If
    sValues = Trim(Mid(sValues, iPos))
    iPos = Instr(sValues, " ")  
    If iPos > 1 Then
        iFailed = CInt(Left(sValues, iPos - 1))
    End If
    sValues = Trim(Mid(sValues, iPos))
    iExtras = CInt(sValues)

    'Aufbereitung Ergebnis  
    If iMismatch <> 0 Then
        sMsg = "Mismatches:"  & vbTab & iMismatch  
    End If
    If iFailed <> 0 Then
        If sMsg <> sOK Then
            sMsg = sMsg & vbCrLF & "Sicherung FAILED: " & vbTab & vbTab & iFailed  
        Else
            sMsg = "Sicherung FAILED: " & vbTab & iFailed  
        End If
    End If
Else
    sMsg = "Dirs-Daten nicht gefunden!"  
End If

WScript.Echo sMsg
If sMsg <> sOK Then WScript.Quit(1) 'Errorlevel setzen  

benutzt. Leider überprüft der ja immer die ganze Logdatei von Robocopy face-sad
Ist es möglich noch einzustellen, dass er immer die letzten X Zeilen überprüft weil der Text immer angehängt wird? Kenne mich in VBS leider nicht wirklich aus...

Mit freundlichen Grüßen
Dominik Fischer
Mitglied: bastla
bastla 14.02.2007 um 10:45:56 Uhr
Goto Top
Hallo DFischer!

Verwendest Du die Option "/LOG+:"? Als Workaround könntest Du mit "/LOG:" jeweils ein neues Log erstellen und bei Bedarf mit "type NeuesLog.txt>>AltesLog.txt" anfügen lassen - überprüfen müsstest Du dann immer nur das neue Log.

Um das Durchlesen aller Zeilen des (neuen) Logs kommst Du aber nicht herum, da ja die Zusammenfassungszeilen durch einen "Mustervergleich" gefunden werden müssen.

Du könntest Dich aber auf die Suche nach einem Pendant zum Unix-Tool "tail" machen, um nur die letzten x Zeilen eines Files zu erhalten und so den Ablauf beschleunigen zu können.

Grüße
bastla
Mitglied: bastla
bastla 14.02.2007 um 11:26:33 Uhr
Goto Top
Hallo DFischer!

Wie schon an anderer Stelle angemerkt, wäre die Aufgabenstellung ohnehin besser per Batch zu lösen - das könnte dann so aussehen:
@echo off & setlocal
set /a Failed=0
for /f "tokens=7" %%i in ('findstr /C:"Files :" RoboLog.txt') do set /a Failed+=%%i  
If %Failed%==0 goto :eof
echo %Failed% Fehler gefunden!
Falls Du auch die "Dirs :"-Zeile mit überprüfen wolltest, könntest Du eine Datei "SuchStrings.txt" mit folgendem Inhalt erstellen:
Dirs :
Files :
und die "for"-Zeile entsprechend abändern:
for /f "tokens=7" %%i in ('findstr /G:SuchStrings.txt RoboLog.txt') do set /a Failed+=%%i  

Grüße
bastla
Mitglied: 43497
43497 14.02.2007 um 12:05:09 Uhr
Goto Top
Kann es sein dass im o.g. Code das Logfile auf die Zeile "Dirs" überprüft wird?

Wäre doch viel sinnvoller die Zeile "Files" zu überprüfen um zu sehen ob wirklich Daten kopiert wurden oder nicht.
Momentan sagt er nämlich auch "Sicherung OK" wenn gar keine Dateien kopiert wurden...
Mitglied: 43497
43497 14.02.2007 um 13:33:00 Uhr
Goto Top
Kann es sein dass im o.g. Code das Logfile
auf die Zeile "Dirs"
überprüft wird?

Wäre doch viel sinnvoller die Zeile
"Files" zu überprüfen um
zu sehen ob wirklich Daten kopiert wurden
oder nicht.
Momentan sagt er nämlich auch
"Sicherung OK" wenn gar keine
Dateien kopiert wurden...

Im übrigen wird eine Batch-Datei im Anhang an einen Backup-Job ausgeführt, doch leider versteckt. Der PC piept zwar wenn das VBS-Message Fenster erscheint, doch man sieht nichts. Gibt es eine Möglichkeit das ganze in den Vordergrund zu schieben?
Mitglied: bastla
bastla 14.02.2007 um 13:35:39 Uhr
Goto Top
Hallo DFischer!

... auf die Zeile "Dirs" überprüft wird?
Ja. Ändere die entsprechende Zeile auf
Const sMarker = "    Files :   "  
und achte auf die Anzahl an Leerstellen - auch nach dem Doppelpunkt müssen es mindestens 2 sein, um die Zeile exakt zu kennzeichnen.

Darf ich trotzdem nochmal dezent auf die Batch-Variante hinweisen?

Grüße
bastla
Mitglied: bastla
bastla 14.02.2007 um 13:45:05 Uhr
Goto Top
Im übrigen wird eine Batch-Datei im Anhang an einen Backup-Job ausgeführt, doch leider versteckt. Der PC piept zwar wenn das VBS-Message Fenster erscheint, doch man sieht nichts. Gibt es eine Möglichkeit das ganze in den Vordergrund zu schieben?
Wie wurde denn die Ausführung "versteckt"?

Ganz nebenbei sei erwähnt, dass durch einen Aufruf per
CScript //nologo CheckRobocopyLog.vbs
nicht nur die Ausgabe in der Konsole erfolgt, sondern auch der Errorlevel abgefragt werden kann - Errorlevel 1 für "Fehler", Errorlevel 0 für "Alles OK". Damit könnte in weiterer Folge zB über blat der Versand einer Mail ausgelöst werden.

Grüße
bastla
Mitglied: 43497
43497 14.02.2007 um 13:55:21 Uhr
Goto Top
Also, wenn ich "Dirs" einfach ein "Files" ändere und auf die entsprechenden Leerzeichen achte sagt er mir "Dirs-Daten nicht gefunden", siehe unten im Code.
Besteht das Problem vielleicht darin, dass die kopierten Dateien in der Zeile nicht den ersten sondern den zweiten Wert haben?

Und wodurch der Aufruf versteckt wurde...Ich denke mal durch Veritas Backup Exec, da kann man an einen Job einen Befehl hängen, und dort wird meine Batch-Datei ausgeführt, allerdíngs im Hintergrund und nicht sichtbar.

Würde es helfen wenn ich den genauen Vorgang aufschreiben würde? Komme mit deiner Batch-Variante nicht ganz klar.

Danke nochmal für die Antworten!

Gruß
Mitglied: bastla
bastla 14.02.2007 um 14:17:16 Uhr
Goto Top
Hallo DFischer!

"Dirs-Daten nicht gefunden"
Sollte besser (allgemeiner) formuliert sein und bedeutet: "Passende Datenzeile lt Vorgabe in sMarker nicht gefunden." - daher vielleicht nochmals den Anfang der "Files :"-Zeile kopieren und bei "sMarker=" zwischen die Anführungszeichen stellen (Leerzeichen am Ende nicht vergessen) - oder, vielleicht noch besser, poste einmal die relevanten Zeilen Deines Beispiellogs.

Komme mit deiner Batch-Variante nicht ganz klar.
Wenn der Batch ohne Fehlermeldung durchläuft, sollte das eigentlich bedeuten, dass in der Spalte "Failed" der Zeile "Files :" der Wert 0 steht. Ändere den entsprechenden Eintrag in der Log-Datei, und es müsste die Fehleranzahl gemeldet werden. Auch hier wäre eine mögliche (weitere) Vorgangsweise das Versenden einer Mail (Stichwort "blat").

Grüße
bastla
Mitglied: 43497
43497 14.02.2007 um 14:31:31 Uhr
Goto Top
Hallo DFischer!

> "Dirs-Daten nicht gefunden"
Sollte besser (allgemeiner) formuliert sein
und bedeutet: "Passende Datenzeile lt
Vorgabe in sMarker nicht gefunden." -
daher vielleicht nochmals den Anfang der
"Files :"-Zeile kopieren und bei
"sMarker=" zwischen die
Anführungszeichen stellen (Leerzeichen
am Ende nicht vergessen) - oder, vielleicht
noch besser, poste einmal die relevanten
Zeilen Deines Beispiellogs.

Wenn ich den sMarker-Eintrag auf die Files-Zeile ändere sagt er immer noch dass die Datensicherung OK sei, vielleicht weil er auf die 3 zielt?

Die Zeilen sehen so aus:

Total/Copied/Skipped/Mismatch/Failed/Extras
Dirs: 1 0 1 0 0 0
Files: 3 0 3 0 0 2

Wie du siehst wurden keine Dateien kopiert, die Sicherung wird aber als erfolgreich anzegeigt.
> Komme mit deiner Batch-Variante nicht
ganz klar.
Wenn der Batch ohne Fehlermeldung
durchläuft, sollte das eigentlich
bedeuten, dass in der Spalte
"Failed" der Zeile "Files
:" der Wert 0 steht. Ändere den
entsprechenden Eintrag in der Log-Datei, und
es müsste die Fehleranzahl gemeldet
werden. Auch hier wäre eine
mögliche (weitere) Vorgangsweise das
Versenden einer Mail (Stichwort
"blat").

Wenn die Sicherung durchgelaufen ist soll der Robocopy-Batch-Befehl gestartet werden. Am Ende des Kopierens sollte ein Fenster erscheinen in dem steht ob das Kopieren OK oder nicht OK war.

Gruß und danke für die Geduld ;)

PS: Bei Bedarf kann ich die Batch-Datei und das VBScript mal hochladen...
Mitglied: bastla
bastla 14.02.2007 um 14:41:27 Uhr
Goto Top
Hallo DFischer!

Total/Copied/Skipped/Mismatch/Failed/Extras
Dirs: 1 0 1 0 0 0
Files: 3 0 3 0 0 2

Da das Programm die Anzahl unter "Failed" überprüft, und diese in beiden Fällen 0 ist, wird kein Fehler festgestellt - der Batch geht genauso vor. Wie sollte denn für Dich die Überprüfung aussehen?
Leicht veränderteter Batch, um auch ein "OK" anzuzeigen (aber immer noch auf Basis "Failed"=0):
@echo off & setlocal
set /a Failed=0
for /f "tokens=7" %%i in ('findstr /C:"Files :" RoboLog.txt') do set /a Failed+=%%i  
If %Failed%==0 goto :OK
echo %Failed% Fehler gefunden!
goto :eof
:OK
echo Sicherung OK (unter "Failed" wurden 0 Dateien vermerkt).  
goto :eof

Grüße
bastla
Mitglied: 43497
43497 14.02.2007 um 14:50:39 Uhr
Goto Top
Hallo DFischer!

>
Total/Copied/Skipped/Mismatch/Failed/Extras
> Dirs: 1 0 1 0 0 0
> Files: 3 0 3 0 0 2

Da das Programm die Anzahl unter
"Failed" überprüft, und
diese in beiden Fällen 0 ist, wird kein
Fehler festgestellt - der Batch geht genauso
vor. Wie sollte denn für Dich die
Überprüfung aussehen?

Überprüft werden sollte, ob die Anzahl unter "Copied" größer 0 ist.

----
Leicht veränderteter Batch, um auch ein
"OK" anzuzeigen (aber immer noch
auf Basis "Failed"=0):
@echo off & setlocal
> set /a Failed=0
> for /f "tokens=7" %%i in ('findstr  
> /C:"Files :" RoboLog.txt') do set  
> /a Failed+=%%i
> If %Failed%==0 goto :OK
> echo %Failed% Fehler gefunden!
> goto :eof
> :OK
> echo Sicherung OK (unter "Failed"  
> wurden 0 Dateien vermerkt).
> goto :eof
> 


Grüße
Dominik
Mitglied: bastla
bastla 14.02.2007 um 15:06:02 Uhr
Goto Top
Hallo DFischer!

Na dann:
@echo off & setlocal
set /a Copied=0
for /f "tokens=4" %%i in ('findstr /C:"Files :" RoboLog.txt') do set /a Copied+=%%i  
If %Copied%==0 goto :Fehler
echo %Copied% Dateien kopiert.
goto :eof
:Fehler
echo Fehler! Es wurden keine Dateien kopiert. Bitte Log überprüfen!
goto :eof

Grüße
bastla
Mitglied: 43497
43497 14.02.2007 um 15:13:44 Uhr
Goto Top
Also meine Batch-Datei sieht momentan so aus:

del "C:\Dokumente und Einstellungen\All Users\Desktop\Logstatus.txt"  

echo Backup Job started:  %DATE% %TIME% >>"C:\Dokumente und Einstellungen\All Users\Desktop\Logstatus.txt"  

C:\Programme\CopyRiteXP\robocopy.exe "\\Nas\Datenkreis1" "\\Extern1\Sicherung1" /E /ZB /COPY:DAT /XF Changer.cfg Folder.cfg /TS /FP  /R:0 /W:0 /LOG:"\\Extern1\Sicherung1\Logbuch_Einzel.log" /TEE /NP  

echo Backup Job ended:  %DATE% %TIME% >>"C:\Dokumente und Einstellungen\All Users\Desktop\Logstatus.txt"  

type "\\Extern1\Sicherung1\Logbuch_Einzel.log" >> "\\Extern1\Sicherung1\Logbuch_Gesamt.log"  

@echo off & setlocal
set /a Copied=0
for /f "tokens=4" %%i in ('findstr /C:"Files :" \\Extern1\Sicherung1\Logbuch_Einzel.log') do set /a Copied+=%%i  
If %Copied%==0 goto :Fehler
echo %Copied% Dateien kopiert.
goto :eof
:Fehler
echo Fehler! Es wurden keine Dateien kopiert. Bitte Log überprüfen!
goto :eof

Leider kommt kein Popup o.Ä. am Ende. Ist der Code so überhaupt richtig geschrieben?
Mitglied: bastla
bastla 14.02.2007 um 15:27:16 Uhr
Goto Top
Hallo DFischer!

Um mehr zu sehen, kannst Du "@echo off & " entfernen und nur "setlocal" belassen und vor jedes "goto :eof" ein "pause" setzen - Popup gibt's zwar dann auch nicht, aber die Meldung kannst Du auch lesen, wenn Du die Batchdatei zB per Doppelklick gestartet hast.

BTW: Die erste Zeile ist Luxus, wenn Du die Umleitung in der zweiten Zeile nur mit einem ">" schreibst - damit wird die ev existierende "Logstatus.txt" durch den neuen Eintrag überschrieben.

Die Meldungen der Batchdatei kannst Du dann (wenn es denn so klappt, wie Du es Dir vorstellst) natürlich auch in die "Logstatus.txt" schicken.

Eigentlich sehe ich bei dem Ganzen derzeit nichts unangenehm Auffallendes - sollte jetzt eigentlich funktionieren.

Grüße
bastla
Mitglied: 43497
43497 14.02.2007 um 15:36:56 Uhr
Goto Top
Ah, wunderbar, es funktioniert! face-smile

Gibts vielleicht noch eine Option ähnlich "Clearscreen"? D.h. dass am Ende nur klar da steht dass das Kopieren in Ordnung bzw. nicht in Ordnung war?

Gruß
Dominik
Mitglied: bastla
bastla 14.02.2007 um 15:42:36 Uhr
Goto Top
Hallo DFischer!

Nicht nur "ähnlich Clearscreen":
cls
steht genau dafür - einfach vor der "If"-Zeile in eine eigene Zeile schreiben.

Grüße
bastla
Mitglied: 43497
43497 14.02.2007 um 15:51:10 Uhr
Goto Top
Ich wusste doch dass es da was gab... ;)

Meine Probleme sind soweit gelöst, dass die CMD nicht im Vordergrund ausgeführt ist ist erst mal egal, muss man es halt per Hand anstarten.

Oder liegt das vielleicht daran dass es eine *.cmd und keine *.bat Datei ist?

Gruß
Mitglied: bastla
bastla 14.02.2007 um 16:01:15 Uhr
Goto Top
Hallo DFischer!

Dieses "Hintergründige" hat sicher nichts mit dem Dateityp ".cmd" zu tun, sondern wohl mit der Art des Aufrufs durch "Backup Exec" - habe aber leider keinen Tipp für Dich.

Grüße
bastla