rumbel
Goto Top

Mit Batch-Datei Verzeichnisse vergleichen

Hallo
Ich möchte gerne zwei Verzeichnisse mit einer Batch-Datei vergleichen ob sie den selben inhalt haben und bei bedarf dann das eine Verzeichniss dem anderen angleichen.
Mein Problem ist das ich die beiden Verzeichnisse nicht verglichen bekomme.
Kann mir da vielleicht einer bei helfen?
Schon mal danke.

Content-Key: 14308

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

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

Mitglied: 11078
11078 Aug 11, 2005 at 10:35:12 (UTC)
Goto Top
Hallo,

allein mit Batch dürfte das sehr kompliziert sein; zumal ein "echter" Vergleich ja nicht nur Dateinamen abgleichen würde sondern auch die Inhalte, bzw. die MD5-Hashes der Dateien vergleichen müsste.

Schau Dir mal das folgende Tool an; es hat eine eingebaute "Batch-Funktion", mit dem sich ein Vergleich automatisieren lässt (Abgleich der Dateien inbegriffen). Scrolle auf der angegebenen Seite mal nach unten zum Abschnitt "Zusätzliche Funktionen", da steht genaueres: http://toolsandmore.de/Central/Produkte/Software/Datei-Tools/Dircomp/


Wenn es auch nur grafisch geht, ist dieses Tool auch noch eine Option:
http://www.winfuture.de/news,21555.html

Unterscheidet sich kaum, nur dass es meines Wissens nach nur über die GUI zu bedienen ist...

Gruß,
TIM
Member: Biber
Biber Aug 11, 2005 at 13:21:40 (UTC)
Goto Top
Moin, Patrick,

auch über CMD ist eine Verzeichnis-Synchronisierung kein Hexenwerk, kommt aber auf die konkreten Anforderungen an.

Wenn es um einen Verzeichnis-Vergleich geht, also darum, den Inhalt und die Unterschiede zweier Verzeichnisse angezeigt zu bekommen und der Benutzer danach manuell Datei für Datei entscheidet, ob und welche Dateiversion in welchem DIR "richtig" ist....dann bist Du mit TIMs zweitem Tipp gut beraten.

Wenn es dagegen um einen automatischen Verzeichnis-Abgleich geht, d.h.
- alle Dateien aus QuellDirA sollen in ZielDirB geschaufelt werden und
- IMMER ist im QuellDirA der einzig wahre und gültige Stand ist und IMMER können die Dateien in ZielDirB ohne Rückfrage überschrieben werden

... dann würde ich einen kleinen Batch vorziehen, der dann ja auch automatisch als Dienst laufen kann... alle 10 Minuten oder alle 5 Stunden oder jeden 3 Freitag im Monat.

Wissen müsste man/frau allerdings noch:
- wenn sich im ZielDirB Dateien befinden, die es im QuellDirA nicht gibt... sollen die auch in ZielDirB gelöscht werden?
- brauchst Du ein Log/Protokolldatei?

Frank / der Biber aus Bremen
Member: geTuemII
geTuemII Aug 12, 2005 at 09:30:08 (UTC)
Goto Top
Hallo,

sieh Dir mal CloneSpy an: http://www.wintotal.de/softw/index.php?rb=45&id=1062

Die Site http://www.clonespy.com hat die aktuelle Version, aber momentan keine weiteren Versionen zur Verfügung.

HTH geTuemII
Member: Rumbel
Rumbel Aug 12, 2005 at 11:30:44 (UTC)
Goto Top
Ok ich werde mir alles mal anschauen. Ich danke euch schon mal für die Antworten.
Member: gambist
gambist Sep 28, 2006 at 14:22:16 (UTC)
Goto Top
Das Vergleichen Mittels Batc-Datei geht natürlich. Es ist ein Bißchen Spielerei, aber man vberwendet dafür nur Betriebssystem-Routinen.

Vergleichen unter win2000 DOSmode:

(x) = unterstes Verzeichnis der zu vergleichenden Dateien (oder Laufwerk)
Beispiel: c:\ oder d:\programme\Lieblingsprogramm

in Notetab light Zeilenwechsel als Zeichen zum editieren: Cursor ans Zeilenende, shift-rechts, ^c
in Suchen/ersetzen ^v diesen Wert eingeben


Parameter für dir -> dir /?

1. Verzeichnis anlegen: dir (x) /b/s>Dateiname

2. editieren von Dateiname:
echo on (zum Sicherstellen, daß die Echo-Funktion eingeschaltet ist, ist eigentlich Standard)
Ersetze von "[Zeilenwechsel]" nach "[Zeilenwechsel]echo "
Datei speichern unter Dateiname.bat

3. Datei ausführen "Dateiname.bat>dateiname2"

Jetzt steht in Dateiname2 jede Zeile zeimal da, einmal mit dem Vorspann des Verzeichnisses, aus dem die Anwendung (dateiname.bat) gestartet wurde, einmal ohne.

4. Zuerst in der zweiten Zeile den Anfang jeweils mit xxx versehen:
Wechsle [Zeilenwechsel]c: in [zeilenwechsel]xxx
es steht ja jeweils an der ersten Zeile das Wort echo, geechot aus dem DOS-BEfehl. Damit ist die Identifizierung jeder zweiten Zeile eindeutig.

5. In Dateiname2 das Wort echo durch comp ersetzen,
[Zeilenwechsel]xxx durch " [Zeilenwechsel](Zielverzeichnis)" ersetzen

6. Dateiname2 unter dateiname2.bat speichern.

7. dateiname2 starten.

Auf dem Bildschirm ist jetzt das Ergebnis des Vergleiches zu beobachten. Optional kann die Batch-Datei auch unter dateiname2>logfile gestartet werden. Damit wird das Ergebnis in die Datei geschrieben

dateiname; dateiname2; logfile sind frei wählbare Dateinamen. Die Dateierweiterung ".bat" muß natürlich nicht getippt werden.

Bei Rückfragen stehe ich gerne zur Verfügung.

Viel Erfolg!

Wolfgang
Member: Biber
Biber Sep 28, 2006 at 18:53:14 (UTC)
Goto Top
Na ja, gambist,

da bin ich nicht so ganz überzeugt von Deiner Strategie.

Wenn ich irgendwo Verzeichnisse A und B vergleichen will, gibt es IMHO drei unbedingt nötige Informationen, die ich liefern muss bzw. sehen will:

- Dateien, die in Verzeichnis A existieren und nicht in Verzeichnis B
- Dateien, die in Verzeichnis B existieren, aber in A fehlen
- Dateien, die in A und B unterschiedlich sind

Für ein Minimum an Entgegenkommen an den Benutzer würden noch als Selbstverständlichkeit dazukommen:
- nur gefundene "Unterschiede" anzeigen - nicht Dateien, die identisch sind
- und bei Unterschieden: Eine Zeile anzeigen pro Datei-Unterschied (nicht mal 2 und mal 7 Zeilen)

Danach kämen die "wünschenswerten" Anforderungen, die ich nur teilweise ohne Verrenkungen mit Batch-Bordmitteln machen kann:
- Verzeichnisstrukturen rekursiv durchsuchen (das wäre noch machbar)
- wenigstens anzeigen, welche Datei die neuere ist (wird schon hakelig)
- die Inhalts-Unterschiede zeilenweise anzeigen bei Textdateien (hmmja.....)
- auch eine Option zum Ersetzen/Synchronisieren anbieten (da hörts dann auf)

However, für die ersten 5 Mimimalansprüche würde ein Quick'n'Dirty-Batch reichen.
Für alles, was darüber hinausgeht, würde ich jemand fragen, der etwas davon versteht - siehe die Verweise auf die einschlägigen Tools oben.

Ein schnell zusammengebratener Batch könnte zu aussehen:
::----snipp QuickNDirtyDirComp.bat [Param1: VerzeichnisA Param2: VerzeichnisB]
@echo off 
for  %%i in ("%1\*.*") do (  
    if not exist "%2\%%~nxi" (  
       echo [in Verz 2:] "%2\%%~nxi" nicht vorhanden.  
    ) ELSE (  
       fc "%%i" "%2\%%~nxi">nul|| echo Dateien "%%~nxi" sind unterschiedlich.  
))
for  %%i in ("%2\*.*") do if not exist "%1\%%~nxi" echo [in Verz 1:] "%1\%%~nxi" nicht vorhanden.  

Der Output von dem Schnipsel würde so aussehen:
>quickndirtyDirComp d:\temp\templogs d:\temp\$home\logs
Dateien "2006-09-28.log" sind unterschiedlich.  
Dateien "log.txt" sind unterschiedlich.  
[in Verz 2:] "d:\temp\$home\logs\temp.txt" nicht vorhanden.  
[in Verz 1:] "d:\temp\templogs\2005logs.txt" nicht vorhanden.  
[in Verz 1:] "d:\temp\templogs\2006-07-03.log" nicht vorhanden.  
[in Verz 1:] "d:\temp\templogs\2006-07-04.log" nicht vorhanden.  
[in Verz 1:] "d:\temp\templogs\2006-07-05.log" nicht vorhanden.  
[in Verz 1:] "d:\temp\templogs\2006-07-06.log" nicht vorhanden.  
[in Verz 1:] "d:\temp\templogs\2006-07-07.log" nicht vorhanden.  
[in Verz 1:] "d:\temp\templogs\2006-07-10.log" nicht vorhanden.  
[in Verz 1:] "d:\temp\templogs\2006-07-11.log" nicht vorhanden.  
...

Das wäre aber auch das Maximum an Aufwand, das mir für eine Batchvariation des Themas sinnvoll erscheint.

[Was ich aber für sinnvoll halte:
So etwas in einem Batch-Einsteigerkurs als Praxis-Aufgabe stellen.
Weil sich da gut sehen lässt, wer sofort mit tippseln anfängt und wer sich erst eine Strategie überlegt].

So - ich bin nun alles losgeworden, was ich zur Frage "Mit Batch-Datei Verzeichnisse vergleichen" loswerden wollte. face-wink

Grüße
Biber
Member: Maertenz
Maertenz Apr 09, 2016 at 18:49:48 (UTC)
Goto Top
Hab das obige Skript mal erweitert/modifiziert. FC funktionierte bei mir nicht mit MP4-Dateien - evtl. zu groß? Statt dessen prüfe ich Dateigröße und, wenn die identisch ist Datum/Uhrzeit. Letzteres war leider nur auf Basis von Minuten möglich, habe es nicht geschafft, die Sekunden auszulesen. In Einzelfällen kann es passieren, dass Dateistempel sich beim Kopieren etwas ändern -> dazu kann man eine Toleranz eingeben (im Skript derzeit Tlr = 1 (min)). Als Gimmick zählt das Skript noch die unterschiedlichen Dateien face-smile

@echo off  
setlocal EnableDelayedExpansion
cls

Set Root=M:\
Set Dest=C:\Users\ich\OneDrive\

REM Toleranz in Minuten beim Zeitvergleich
set Tlr=1
set /A CompR=0
set /A CompD=0
set /A MissD=0
set /A MissR=0
set /A Diff=0

echo.
echo Erst Dateien in %Root% pruefen
for /f "delims=" %%i in ('dir "%Root%" /b /s /a-d') do (set RF=%%i&& set /A CompR=CompR+1 && set DF=!RF:%Root%=%Dest%!&& if not exist !DF! (echo %%~nxi -----^> nicht in %Dest% vorhanden! && set /A MissD=MissD+1) else (set RT=%%~ti && set RS=%%~zi && set RTIso=!RT:~8,2!!RT:~3,2!!RT:~0,2!!RT:~11,2!!RT:~14,2! && for %%j in ("!DF!") do (set DS=%%~zj && IF !DS! neq !RS! (echo %%~nxi -----^> hat andere Groesse in %Dest%! && set /A Diff=Diff+1) else set DT=%%~tj && set DTIso=!DT:~8,2!!DT:~3,2!!DT:~0,2!!DT:~11,2!!DT:~14,2! && set /A DTIsoMinus=!DTIso!-%Tlr% && set /A DTIsoPlus=!DTIso!+%Tlr% && if !RTIso! gtr !DTIsoPlus! (echo %%~nxi #####^> ist in %Root% neuer als in %Dest%! && set /A Diff=Diff+1) else if !RTIso! lss !DTIsoMinus! (echo %%~nxi -----^> ist in %Root% aelter als in %Dest%! && set /A Diff=Diff+1) )))  

echo.
echo Nun Dateien in %Dest% pruefen
for /f "delims=" %%i in ('dir "%Dest%" /b /s /a-d') do (set RF=%%i&& set /A CompD=CompD+1 && set DF=!RF:%Dest%=%Root%!&& if not exist !DF! (echo %%~nxi -----^> nicht in %Root% vorhanden! && set /A MissR=MissR+1))  

echo %CompR% Dateien in %Root% geprueft
echo %CompD% Dateien in %Dest% geprueft
echo %MissR% Dateien fehlen in %Root%
echo %MissD% Dateien fehlen in %Dest%
echo %Diff% Dateien sind in %Root% anders als in %Dest%

Feedback welcome!
Member: volker01
volker01 Jun 19, 2016 at 11:31:37 (UTC)
Goto Top
Es bleiben doch einige Unwägbarkeiten, wie z.Bsp. spezielle Zeichen in Dateinamen, (zu) lange Dateinamen, etc.

Mein Favorit ist das Open-Source Programm FreefileSync:
Wird über eine grafische Oberfläche eingerichtet, hat einen Batch-Modus, gibt einen Errorlevel aus, schreibt eine Log-Datei, kann mit geöffneten Dateien umgehen (VSS). Kommt mit langen Pfaden zurecht ...
(Installer enthält Adware)

Gruß Volker01