michel123
Goto Top

Binärer Dateivergleich per Batchprogramm von Verzeichnisbäumen mit FC - wie, was ist zu beachten ?

Nach einem Systemabsturz scheint auch die Datenpartition Schäden davon getragen zu haben. Auf unterschiedlichen Wegen habe ich Sicherungen der Datenpartition auf anderen Festplatten gemacht (Kopieren im Windows, mit Utility vom Festplattenhersteller die gesamte Partition kopiert und mit einem Recovery-Programm) --> 3 Partitionen deren Inhalt identisch sein sollte. Ist er aber nicht - unterschiedliche Gesamtgröße und Dateizahl. --> nicht alle Dateien sind in allen drei Kopien vorhanden.

Nun möchte ich die Dateien miteinander binär vergleichen, da ich bereits eine Datei gefunden habe (ein Bild) das in der Vorschau anscheinend richtig angezeigt wird, beim Bearbeiten stellt sich aber heraus, daß etwas mit diesem Bild nicht stimmt. In einer anderen der 3 Kopien kann das Bild problemlos bearbeitet werden.

Einige der Daten habe ich auf einer USB-PLatte aber leider nicht alle.

Asche auf mein Haupt, daß ich mich nicht konsequenter um die Sicherung der Daten bemüht habe.

Technische Daten:
Betriebssystem: Win XP Home mit SP2
Dateianzahl: ca. 12.000
Dateigröße: wenige Byte bis ca. 9 GB (AVI-DV-Datei)
Anzahl Verzeichnisse: viele
Namen Dateien und Verzeichnisse: mit Leerzeichen, äöüÄÖÜ', alles was lt. Windows XP zulässig ist.

Meine Vorstellung zur Problemlösung:
Mit
dir d:\ /S /B > dir_d.txt
Liste mit allen Dateien erzeugen.
In der Datei stehen dann Zeilen wie:
d:\temp
d:\tmp
d:\temp\img_1234.tif
d:\tmp\capture_1.avi
Leider stehen in der Datei aber auch die Verzeichnisse und ich kann nicht ausschließen, daß es Punkte im Ordnernamen gibt. Es könnte außerdem auch Dateien ohne Erweiterung geben. Wie können die reinen Pfadangaben aus diesr Liste aussortiert werden, da sie beim Filecompare nur unnötige Fehlermeldungen produzieren (s.u.).

Zur Prüfung stelle ich mir eine Batch-Datei mit Schleife vor, in der die Einträge der obigen Liste abgearbeitet werden, in z.B. folgender Art:
FOR /F "delims=: tokens=1,2" %%i IN (dir_d.txt)
DO
FC / b d:\%%j e:\%%j > NULL
IF ERRORLEVEL "für Dateien sind identisch" @echo identisch %%j >> Ergebnis.txt
IF ERRORLEVEL "für Dateien sind unterschiedlich bzw. nicht vorhanden" @echo Fehler %%j >> Ergebnis.txt
IF ERRORLEVEL "für Dateien sind unterschiedlich bzw. nicht vorhanden" @echo Fehler %%j >> Fehler.txt
Ende der FOR-Schleife

"%%j" soll die Pfadangabe und den Dateinamen, jedoch ohne Laufwerksangabe enthalten.
Umleitung der Ausgabe nach Null (Nirvana), da bei Unterschieden in den Dateien die Ausgabe der Unterschiede nicht weiter interessiert.
Ausgabe in zwei Dateien, daß einerseits eine Kompakte Darstellung erreicht wird (Fehler.txt) und andererseits ein Log-Datei protokolliert, welche Dateien berücksichtigt wurden (Ergebnis.txt).

Der Anfang mit
FOR /F "delims=: tokens=1,2" %%i IN (dir_d.txt) DO @echo FC / b d:\%%j e:\%%j
liefert den Befehlsaufruf, und der sieht auf den ersten Blick auch gut aus.
Leider gibt es aber auch folgendes
FC /b d:\temp e:\temp
Wie zu erkennen ist, fehlen die Dateien am Ende der Pfadangabe, da in der Datei "dir_d.txt" auch solche Zeilen enthalten sind - für jedes Verzeichnis eine - leider (s.o.).

Auch das mit der Umleitung nach NULL und der Auswertung des ERRORLEVELS funktioniert nicht wie ich mir das vorstelle.
Was ist hierbei zu beachten ?

Welche Errorlevel gibt es bei Filecompare FC und wofür stehen sie ?

Darf die FOR-Schleife aus mehreren Zeilen bestehen ?
Ein NEXT %%i scheint es nicht zu geben. Woran wird das Ende der FOR-Schleife erkannt ?

Ist eine FOR-Schleife hier überhaupt das richtige ?
Wie sind die Variablen aus der Datei dir_d.txt zu übergeben, daß bei der Übergabe die Leer- und Sonderzeichen im Pfad- und Dateinamen richtig verarbeitet werden, ...
Wie können die Zeilen ohne Dateiname am Ende aus der "dir_d.txt" eleminiert werden ?
Es gibt sicher weitere Fallstricke wie nach der Lektüre einiger anderer Beiträge vermute.

Bitte helft mir weiter.

Vielen Dank für die Hilfen.
Gruß Michel

Content-Key: 55534

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

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

Member: bastla
bastla Apr 01, 2007 at 09:57:01 (UTC)
Goto Top
Hallo michel123 und willkommen im Forum!

Um Verzeichnisse auszuschließen kannst Du den "dir"-Befehl um den Schalter "/a-d" ergänzen.

Die Schleife könntest Du wie folgt aufbauen:
@echo off & setlocal
if exist C:\Ergebnis.txt del C:\Ergebnis.txt
if exist C:\Fehler.txt del C:\Fehler.txt
for /f "tokens=1* delims=:" %%i in (C:\dir_d.txt) do call :ProcessFile "%%j"  
goto :eof
:ProcessFile
if not exist "d:%~1" goto :Fehler  
if not exist "e:%~1" goto :Fehler  
fc /b "d:%~1" "e:%~1" >nul || goto :Fehler  
echo identisch %~1>>C:\Ergebnis.txt
goto :eof
:Fehler
echo Fehler %~1>>C:\Ergebnis.txt
echo Fehler %~1>>C:\Fehler.txt
goto :eof
Kurze Erklärung:
Der Ordnung halber habe ich der Dateiliste und den Protokolldateien einen Pfad (im Beispiel "C:\") zugeordnet.

Durch den Unterprogrammaufruf zur Verarbeitung der einzelnen Dateien kannst Du nicht nur mehrere Befehlszeilen verwenden, sondern auch sehr flexibel die Verarbeitung steuern - das "goto :eof" entspricht einem "Return".

Das Unterprogramm ist wie eine weitere Batchdatei zu betrachten, daher werden auch die übergebenen Parameter mit %1, %2, etc nummeriert. Übergeben werden die Dateinamen mit einschließenden Anführungszeichen, damit enthaltene Leerstellen keine Probleme verursachen.

Die Sonderzeichen sollten unproblematisch sein, da die Dateiliste ja ebenfalls aus der CMD-Shell erstellt und daher die gleiche Codepage (vermutlich 850) verwendet wird.

Die Schreibweise %~1 entfernt beim übergebenen Dateinamen die Anführungszeichen wieder.


Anmerkung: Durch die Verwendung des Delimiters ":" beginnen die Dateinamen/-pfade jeweils mit einem "\" - wenn's stören sollte, könnte alternativ unter Verwendung einer dazwíschengeschalteten Variable einfach der Name/Pfad ab dem 4. Zeichen (also hinter "D:\" beginnend) verwendet werden.

Grüße
bastla
Member: michel123
michel123 Apr 01, 2007 at 21:55:17 (UTC)
Goto Top
Hallo Bastla,

Danke - es funktionierte auf Anhieb.
Gut fand ich insbesondere auch, daß Du einige Sachen noch erklärt hast.

Auf 2 Probleme bin ich noch gestoßen:
- Systemabsturz nach einiger Zeit und Reboot, ohne das ich eingriff - Ursache unbekannt, auch die Ereignismeldungen gaben hierzu nichts her,
- Abbruch der Abarbeitung bei einem Dateinamen, der Anführungszeichen (") enthielt.
Hie hat mir die Log-Datei gute Dienste geleistet.

Die Dateien mit Anführungszeichen im Namen habe ich aus der Liste entfernt.

Als Laufzeit für den ersten Vergleich habe ich ca. 7 h errechnet (aus Task-Manager, Prozesse, Spalte E/A-Bytes lesen). Ich bin gespannt wie lange es tatsächlich dauern wird.
Ich vermute das liegt auch daran, daß die beiden zu vergleichenden Partitionen auf einer Platte liegen. Die dritte zu vergleichende Partition liegt auf einer anderen Platte.

Falls Dir hierzu noch Verbesserungen einfallen - nur her damit.

Schon jetzt frohe Ostern für alle.

Gruß
Michel
Member: Biber
Biber Apr 02, 2007 at 16:00:09 (UTC)
Goto Top
Moin michel123,

willkommen im Forum.
Die Dateien mit Anführungszeichen im Namen habe ich aus der Liste entfernt.

Na, so weit wollen es aber nicht kommen lassen...
<u>Streiche:</u> for /f "tokens=1* delims=:" %%i in (C:\dir_d.txt) do call :ProcessFile "%%j"  
<u>Setze:</u> for /f "delims=" %%i in (C:\dir_d.txt) do call :ProcessFile "%%~pnxi"  
Gruss
Biber
Member: Biber
Biber Apr 18, 2007 at 21:01:29 (UTC)
Goto Top
Moin michel123,

Nachfrage: wie ist denn der gefühlte Beantwortungsgrad Deiner Frage?

Gruss
Biber
Member: michel123
michel123 Apr 25, 2007 at 18:30:30 (UTC)
Goto Top
Hallo Biber,

bitte entschuldige die Funkstille meinerseits - ich war im Osterurlaub.
Ich hoffe Du hattest auch schöne Tage.

Den Nachtrag bzgl. der Anführungszeichen im Dateinamen habe ich erst heute gelesen - und noch nicht ausprobiert.
Glücklicherweise konnte ich auf diese Dateien auch verzichten bzw. sie problemlos neu erstellen - es handelte sich um abgespeicherte WEB-Seiten.

Die Rechnerabstürze könnten möglicherweise darauf zurückzuführen sein, daß die Sicherungsfestplatten nicht im Rechner eingebaut sind - sie liegen auf dem Rechner und wurden unerwarteterweise ziemlich heiß. Mir scheint die Samsung T166 werden deutlich wärmer als die Samsung P120 Modelle. Vielleicht fehlte hier der Luftzug im Rechnergehäuse.

Der Vergleich zweier Partitionen auf einer Festplatte dauerte zwischen 14 und 15 Stunden.
Die Vergleiche der Daten auf unterschiedlichen Festplatten ging deutlich schneller ca. 3 h und ich glaube auch ohne Rechnerabstürze.

Vielen Dank für Deine Ergänzung - ich werde sie demnächst ausprobieren.

Gruß
Michel
Member: Biber
Biber Apr 25, 2007 at 19:42:01 (UTC)
Goto Top
Moin michel123,

ich hoffe, Du hast im Osterurlaub Aufregenderes erlebt als einen binären Dateivergleich per Batch. face-wink

Wie ich für mich aussieht, könnten wir den Beitrag auf "Gelöst" und "Geschlossen" setzen, oder?

Denn grundsätzlich scheint es ja zu laufen.
Und wenn es eine einmalig notwendige Aktion war, dann lohnt es sich sicherlich kaum, die oben mit einer Handvoll Batchzeilen zusammengekitteten FC-Aufrufe aus Performance-Gründen komplett in irgendeiner Hochsprache nachzubilden.

Bei dem Versuch könnte ja der nächste Osterurlaub draufgehen...*gg

Grüsse
Biber
Member: michel123
michel123 Apr 25, 2007 at 20:00:34 (UTC)
Goto Top
Hallo Biber,
ich stimme Dir zu.
Wer macht das "auf gelöst setzten" und falls das meine Aufgabe ist - wie mache ich das ?
Gruß
Michel
Member: Biber
Biber Apr 25, 2007 at 20:32:40 (UTC)
Goto Top
Moin michel123,

im Prinzip teilen sich Beitragsersteller und der Mod des Unterforums diese (angenehme) Aufgabe.

Ein angemeldeter/eingeloggter Fragesteller kann direkt unter der Eröffnungsfrage den Button "Editieren" anklicken.
Im Folgefenster sind dann einige Kontrollkästchen anwählbar, unter anderem "Dieser Beitrag gilt als gelöst".
Damit erzeugst Du diesen hübschen grünen Erledigt-Haken.

Danach wird/sollte dann der zuständige Mod diesen Beitrag schließen.
(Der Mod hat dann ein oder zwei Kontrollkästchen mehr, z.B.
"Dieser Beitrag ist geschlossen und kann nicht mehr beantwortet werden.")

Und dieses Schließen eines Beitrags ist (mir) deshalb so wichtig, weil sonst Jahre später irgendeine Schafsnase einen Kommentar druntersemmelt beginnend mit "ich hab genau dasselbe problem, abba mein Drucker schmiert dabei immer so..."

Und diese Menschen sollen dann lieber einen neuen Beitrag aufmachen.

So, back to thread.... ich lass Dir dann mal den Vortritt, damit Du es ausprobieren kannst.

Schönen Abend
Biber