Verzeichnissinhalt per Batch vergleichen?

opera-fansite

fühlt sich hier wohl
Hallo,
weiß einer wie ich den Inhalt zweier Verzeichnisse vergleichen kann und dann geänderte Dateien in der Kopie aktualisieren kann?

bisher mache ich es per (cmp.exe ist angehängt):
--------------------------------------------------------------
| cmp.exe -s adprefs.ini backup\adprefs.ini
| if not errorlevel 1 goto Contacts.adr
|
| xcopy adprefs.ini backup /y /q
--------------------------------------------------------------

Allerdings funktioniert das für ganze Ordner nicht.
Weiß jemand eine Alternative?
 

Anhänge

  • cmp.zip
    5,1 KB · Aufrufe: 378
hi,
häng' das mal in eine FOR-Schleife:

FOR /R %%f IN (*.*) DO vergleich - wobei vergleich deine Batch ist....

Näheres in der Online-Hilfe: Befehl FOR und Erweiterungen
 
FOR /R %%f IN (*.*) DO vergleich - wobei vergleich deine Batch ist...

ist auch nur die Grundstruktur -->
..DO CMP.exe -s QuellLfw:\QuellDir\%%f ZielLfw:\ZielDir\%%f

Das Problem bei FOR-Anweisung ist, dass damit nur eine Zeile abgearbeitet wird,
also die Befehle 'IF ERRORLEVEL 1 ..' und XCOPY nicht mehr zum Zuge kommen können.

Lösung: Es muss ein zweiter Batch aufgerufen werden mit Übergabe der in der FOR-
Anweisung gefundenen Dateinamen, etwa so

..DO CALL vergleich.bat %%f

Vergleich.bat [.cmd; Datei muss im Pfad liegen; die übergebene Variable %%f wird hier zu %1]
---
CMP.exe -s QuellLfw:\QuellDir\%1 ZielLfw:\ZielDir\%1
if not errorlevel 1 if errorlevel 0 EXIT

xcopy QuellLfw:\QuellDir\%1 ZielLfw:\ZielDir\%1 /y /q
-----------------------------

Ratschlag: Wenn nicht Riesendateien kopiert werden, scheint mir obige
Lösung ziemlich umständlich, da nach deinem Batch bei Ungleichheit
bedingungslos kopiert wird. Also einfach nur
xcopy QuellLfw:\QuellDir\*.* ZielLfw:\ZielDir\*.* /y /q

Für den Fall, dass auf QuellLfw:\QuellDir\ auch mal Dateien entfernt werden,
müsstest du 'RD /S /Q QuellLfw:\QuellDir' [Syntax NT,W2k,XP]
bzw. 'Deltree /y QuellLfw:\QuellDir' vorher aufrufen.
 
OK xxx, du willst es selbst heraustüfteln, ist nicht verkehrt, denn
hinter den bunten Buttons stecken meist auch nur diese knallharten
Befehle.

Einen TIPP gibt es aber noch (sieh das Gute liegt so nah :D):
Dein Ziel ist tatsächlich nur, geänderte Dateien in ein
Sicherungsverzeichnis zu kopieren? Denn dafür gibt es bereits
einen fertigen Befehl - und er heisst XCOPY: Wird nämlich eine
Datei verändert, so wechselt das sogenannte Archivattribut der
Datei von -A [nichts zu sichern] nach +A. Das lässt sich überprüfen
durch Eingabe von 'Attrib *.*' und per XCOPY verwenden!

XCOPY /? zeigt unter WinXP folgende Hilfe
"Kopiert Dateien und Verzeichnisstrukturen.
------------------------------------------
XCOPY Quelle [Ziel] [/A | /M] [/D[: Datum]] [/P] [/S [/E]] [/V] [/W]
[/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U]
[/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z]
[/EXCLUDE: Datei1[+Datei2][+Datei3]...]

Quelle Die zu kopierenden Dateien.
Ziel Position und/oder Name der neuen Dateien.
/A Kopiert nur Dateien mit gesetztem Archivattribut,
Ändert das Attribut nicht.
/M Kopiert nur Dateien mit gesetztem Archivattribut,
setzt das Attribut nach dem Kopieren zurück.
/D:M-T-J Kopiert nur die an oder nach dem Datum geÄnderten Dateien.
Ist kein Datum angegeben, werden nur Dateien kopiert,
die neuer als die bestehenden Zieldateien sind.
/EXCLUDE: Datei1[+Datei2][+Datei3]...
Gibt eine Liste von Zeichenfolgen an. Jede Zeichenfolge
sollte in einer einzelnen Zeile in der Datei angezeigt werden.
Wenn eine der Zeichenfolgen Teil des absoluten Verzeichnispfads
der zu kopierenden Datei ist, wird diese Datei vom
Kopiervorgang ausgeschlossen. Beispiel: Bei der
Zeichenfolge \obj\ oder .obj werden alle Dateien
unterhalb des Verzeichnisses OBJ bzw. alle Dateien mit
der Erweiterung .obj vom Kopiervorgang ausgeschlossen.
/P Fordert vor dem Erstellen jeder Zieldatei eine BestÄtigung.
/S Kopiert Verzeichnisse und Unterverzeichnisse, die nicht leer sind.
/E Kopiert alle Unterverzeichnisse (leer oder nicht leer).
Wie /S /E. Mit dieser Option kann die Option /T geÄndert werden.
/V šberprüft jede neue Datei auf Korrektheit.
/W Fordert vor dem Beginn des Kopierens zu einem Tastendruck auf.
/C Setzt das Kopieren fort, auch wenn Fehler auftreten.
/I Falls Ziel nicht vorhanden ist und mehrere Dateien kopiert
werden, nimmt XCOPY an, dass das Ziel ein Verzeichnis ist.
/Q Zeigt beim Kopieren keine Dateinamen an.
/F Zeigt die Namen der Quell- und Zieldateien beim Kopieren an.
/L Listet die Dateien auf, die ggf. kopiert werden.
/G Ermöglicht das Kopieren von verschlüsselten Dateien auf ein
Ziel wo Verschlüsselung nicht unterstützt wird.
/H Kopiert auch Dateien mit den Attributen 'Versteckt' und 'System'.
/R šberschreibt schreibgeschützte Dateien.
/T Erstellt die Verzeichnisstruktur, kopiert aber keine Dateien.
Leere oder Unterverzeichnisse werden nicht kopiert. Um auch diese
zu kopieren, müssen Sie die Optionen /T /E angeben.
/U Kopiert nur Dateien, die im Zielverzeichnis vorhanden sind.
/K Kopiert Attribute. StandardmÄáig wird 'Schreibgeschützt' gelöscht.
/N Beim Kopieren werden die erzeugten Kurznamen verwendet.
/O Kopiert Informationen über den Besitzer und ACL.
/X Kopiert Dateiüberwachungseinstellungen (bedingt /O).
/Y Unterdrückt die Aufforderung zur BestÄtigung, dass eine
vorhandene Zieldatei überschrieben werden soll.
/-Y Fordert zur BestÄtigung auf, dass eine bestehende
Zieldatei überschrieben werden soll.
/Z Kopiert Dateien in einem Modus, der einen Neustart ermöglicht.

Die Option /Y kann in der Umgebungsvariable COPYCMD vordefiniert sein.
Sie kann mit /-Y in der Befehlszeile deaktiviert werden."
------------------------------------------
Der vollständige Befehl würde also lauten:

XCOPY QuellLfw:\QuellDir\*.* ZielLfw:\ZielDir\*.* /M /Y [/S]

/M Kopiert nur Dateien mit gesetztem Archivattribut,
setzt das Attribut nach dem Kopieren zurück
[die Quell-Datei wird danach auf gesichert gesetzt].
/Y Unterdrückt die Aufforderung zur Bestätigung, dass eine
vorhandene Zieldatei Überschrieben werden soll.
/S Kopiert Verzeichnisse und Unterverzeichnisse, die nicht leer sind.
 
Oben