Die standalone console version von 7-Zip eignet sich wunderbar für Skripte zum Automatisieren von Archivierungen, Datensicherungen usw. Möchte man ein Protokoll erhalten, welches sowohl die allgemeinen Ausgaben als auch evtl. Fehlermeldungen enthält, muss eine Kleinigkeit beachtet werden.

In Batch-Skripten unter Windows kann i.d.R. einfach die Standard-Ausgabe umgeleitet werden:

7z.exe a <Archivname.7z> <Quelle>\ > 7-Zip-Log.txt

Dies ergibt ein Protokoll wie dieses:

7-Zip [64] 16.04 : Copyright (c) 1999-2016 Igor Pavlov : 2016-10-04

Scanning the drive:
67 folders, 722 files, 204362247 bytes (195 MiB)

Creating archive: <Archivname.7z>

Soweit so gut. Kommt es allerdings zu einer Warnung oder zu einem Fehler, so fehlt dies im Protokoll. Über den Rückgabewert (Errorlevel) kann man auf jeden Fall das Ergebnis von 7-Zip erhalten und so z.B. eine “Fehlerstatus-Datei” erstellen:

if not %errorlevel%==0 echo %date% 7-Zip - Fehler - %errorlevel% > 7-Zip-Error.txt

Dieses Konstrukt funktioniert bei uns mittels Aufgabe wunderbar. Aber leider war im Fehlerfall immer eine manueller Durchlauf nötig um Anhand der Ausgabe zu sehen, woran es hängt. Beim umfangreichen “Archiv-Bau” eine minunter langwierige Aufgabe. Daher musste eine Verbesserung her.

Damit nicht nur die Standard-Ausgabe, sondern auch die Fehlerausgabe umgeleitet wird, muss lediglich eine kleine Ergänzung hinzu kommen:

7z.exe a <Archivname.7z> <Quelle>\ > 7-Zip-Log.txt 2>&1

Es muss also nur ” 2>&1″ angehängt werden. Dies sorgt dafür, das die Ausgaben zusammengefasst werden und letztlich ins Protokoll gelangen. Führt man den Befehl bzw. das Skript nun aus, sieht man allerdings nichts mehr in der Eingabeaufforderung, dies ist nur ein kleiner Wehrmutstropfen, schließlich läuft dieses nachts als Aufgabe.

Im Fehlerfall sieht das Protokoll z.B. so aus:

7-Zip [64] 16.04 : Copyright (c) 1999-2016 Igor Pavlov : 2016-10-04

Scanning the drive:
67 folders, 722 files, 204362247 bytes (195 MiB)

Creating archive: <Archivname.7z>



ERROR:
Duplicate filename on disk:
<Pfad\Dateiname.pdf>
<Pfad\Dateiname.PDF>

Die Leerzeilen zwischen “Creating…” und “ERROR:” sind kein Fehler, sondern entstehen beim Durchlauf. In diesem Beispiel gab es beim Packen von Dateien die auf einem Linux-Server liegen einen Konflikt. Windows unterscheidet nicht zwischen Groß- und Kleinschreibung, unixoide Betriebssysteme wie Linux allerdings schon.

Der Rückgabewert war in diesem Fall eine Zwei für Warnung. Die verfügbaren Errorlevels lauten übrigens:

Code / Meaning
0 / No error
1 / Warning (Non fatal error(s)). For example, one or more files were locked by some other application, so they were not compressed.
2 / Fatal error
3 / change identified (does this indicate a change in the archive file itself or a difference when comparing archive file contents to the original source?)
7 / Command line error
8 / Not enough memory for operation
255 / User stopped the process

Quelle: 7-Zip 7z.exe ERRORLEVEL Codes

Anbei ein paar Links mit weiteren Infos und Quellen:

7-Zip – Discussion – Output log of 7zip extract

Rob van der Woude’s Scripting Pages – Batch files – Redirection

Windows XP Professional Product Documentation – Using command redirection operators