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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 14308
Url: https://administrator.de/forum/mit-batch-datei-verzeichnisse-vergleichen-14308.html
Ausgedruckt am: 11.04.2025 um 19:04 Uhr
8 Kommentare
Neuester Kommentar

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
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
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
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
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
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
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
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
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:
Der Output von dem Schnipsel würde so aussehen:
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.
Grüße
Biber
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.
Grüße
Biber
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 
Feedback welcome!
@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!
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
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