inbase
Goto Top

Synchronisation einer Ordnerstruktur

Hallo,
ich habe folgendes Patch-Programm zur Synchronisation einer
Ordnerstruktur auf zwei unterschiedlichen Laufwerken geschrieben:

set Quelle="C:\Testverzeichnis"
set Ziel="D:\Testverzeichnis"
set Logdatei="D:\logdatei.txt"
echo %date% %time% >> %logdatei%
xcopy %Quelle% %Ziel% /v /f /d /s /e /r /y /z /i >> %Logdatei%
echo. >> %logdatei%

Die Patchdatei wird im Autostart-Ordner täglich ausgeführt und
dokumentiert in der Logdatei die synchronisierten Dateien.
Das funktioniert wunderbar, hat aber einen Nachteil:
Gelöschte Dateien in %Quelle% werden in %Ziel% nicht gelöscht,
also die Ordnerstruktur wird nicht richtig synchronisiert.
Wie kann ich dies mit zusätzlichen Batchbefehlen erreichen?

Gruß
Inbase

Content-Key: 37115

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

Printed on: April 23, 2024 at 07:04 o'clock

Member: Supaman
Supaman Aug 01, 2006 at 20:26:33 (UTC)
Goto Top
gar nicht. für solche funktionen brauchst du eine software, die solche unterschiede anhand einer datenbank feststellen kann und dann die entsprechenden aktionen (löschen oder ins archiv verschieben) durchführt.

gute syncsoftware: http://www.tgrmn.com/
Member: Inbase
Inbase Aug 02, 2006 at 19:43:11 (UTC)
Goto Top
habe das Problem mit "robocopy" aus dem Windows "Server 2003 Resource Kit Tools"
lösen können
Danke
Inbase
Member: Biber
Biber Aug 03, 2006 at 17:07:52 (UTC)
Goto Top
Moin Inbase, moin Supaman,

die Aussage "geht mit Batch nicht" kann ich natürlich nicht so stehenlassen, dafür habt ihr bestimmt Verständnis face-wink

Wenn als Hilfsmittel nur XCopy zur Verfügung stünde (also weder RoboCopy noch ein Sync-Tool installiert ist), dann wäre meine Strategie wie folgt [ungetestete Skizze]...
-------- snipp SyncMitXCopy.bat
@echo off & setlocal
set Quelle="C:\Testverzeichnis"  
set Ziel="D:\Testverzeichnis"  
set Logdatei="D:\logdatei.txt"  
Set "xcopyParms=/v /f /d /s /e /r /y /z /i"  
echo %date% %time% >> %logdatei%
xcopy %Quelle% %Ziel% %xcopyParms%>> %Logdatei%
echo. >> %logdatei%
::rem Im Anschluss eine Liste [/L] aller Dateien, die NUR in QUELLE vorhanden sind [/U] erzeugen
XCopy %Ziel% %Quelle% /L /U >%temp%\OnlyInTarget.Lst
:: Diese Liste Datei für Datei abarbeiten...alle Dateien, die NUR in ZIEL vorhanden sind, löschen
FOR /F "delims=" %%i in (%temp%\OnlyInTarget.Lst) do DEL /y "%%i">nul  
::-----snapp SyncMitXCopy.bat [ungetestete Skizze] ----------

Diese zwei Zeilen mehr tun doch nicht weiter weh...

Gruß
Biber
P.S. @Supaman
Sollte aber nur eine Anmerkung sein; natürlich spricht nichts gegen ein Sync-Tool oder auch gegen "RoboCopy /MIR".
P.P.S. @Inbase
Bitte einen Beitrag auch dann auf "Gelöst" setzen, wenn Du selbst eine Lösung gefunden hast. Danke.
Member: miniversum
miniversum Aug 04, 2006 at 08:26:31 (UTC)
Goto Top
so gehts etwas besser:

@echo off & setlocal
set Quelle="E:\quelle"
set Ziel="E:\ziel"
set Logdatei="logdatei.txt"
Set "xcopyParms=/v /f /d /s /e /r /y /z /i"
:: Eine Liste [/L] aller Dateien, die NUR in QUELLE vorhanden sind erzeugen
XCopy %Ziel% %Quelle% /L /v /d /s /e /r /y /z /i >%temp%/OnlyInTarget.Lst
:: Diese Liste Datei für Datei abarbeiten...alle Dateien, die NUR in ZIEL vorhanden sind, löschen
FOR /F "delims=" %%i in (%temp%/OnlyInTarget.Lst) do DEL "%%i"
:: Jetzt die Dateien die von Quelle nach Ziel kopieren
echo %date% %time% >> %logdatei%
xcopy %Quelle% %Ziel% %xcopyParms%>> %Logdatei%
echo. >> %logdatei%

miniversum

edit: noch 'n fehler gefunden...
Member: Biber
Biber Aug 04, 2006 at 08:29:56 (UTC)
Goto Top
Thx, miniversum,
hatte den %xcopyparms%-Parameter vergessen.
Eigentlich sollte man/frau ja Code auch erst testen und dann posten, aber....

Schönes Wochenende
Biber
Member: miniversum
miniversum Aug 04, 2006 at 11:12:01 (UTC)
Goto Top
Bitte.
So ganz perfekt ists aber auch nicht.
Aber vielleicht macht wer anders ja dran weiter und dann wirds ein ganz toller Batch. face-wink

miniversum
Member: miniversum
miniversum Aug 05, 2006 at 18:20:36 (UTC)
Goto Top
So weils mir keine Ruhe lies... was funktuionierendes...

@echo off & setlocal

set Quelle="E:\quelle"  
set Ziel="E:\ziel"  

:: Quelle und Ziel als Laufwerke einbinden
for %%L in (d e f g h i j k l m n o p q r s t u v w x y z) do if not exist %%L:\>NUL set LWdelquelle=%%L:
if %LWdelquelle.==. (
  echo.
  echo FEHLER: Auf Ihrem System existiert kein freier Laufwerksbuchstabe. 
  goto eof
)
if (%Quelle:~2,1%)==(:) subst %LWdelquelle% %Quelle% > NUL
if (%Quelle:~2,1%)==(\) net use %LWdelQuelle% %Quelle% > NUL

for %%L in (d e f g h i j k l m n o p q r s t u v w x y z) do if not exist %%L:\>NUL set LWdelZiel=%%L:
if %LWdelZiel.==. (
  echo.
  echo FEHLER: Auf Ihrem System existiert kein freier Laufwerksbuchstabe. 
  goto eof
)
if (%Ziel:~2,1%)==(:) subst %LWdelZiel% %Ziel% > NUL
if (%Ziel:~2,1%)==(\) net use %LWdelZiel% %Ziel% > NUL


:: Eine Liste alles Dateien und Verzeichnisse im Ziel erzeugen
:: Danach alle Dateien und Verzeichnisse die nicht in der Quelle vorhanden sind löschen
dir /s /b /ad %LWdelZiel% >%temp%\OnlyInTarget.Lst
for /F "delims=: tokens=2" %%a in (%temp%\OnlyInTarget.Lst) do if NOT exist %LWdelQuelle%\%%a\NUL RD /Q /S "%LWdelZiel%%%a"  
dir /s /b /a-d %LWdelZiel% >%temp%\OnlyInTarget.Lst
for /F "delims=: tokens=2" %%a in (%temp%\OnlyInTarget.Lst) do if NOT exist %LWdelQuelle%\%%a del /Q /S "%LWdelZiel%%%a"  


:: Laufwerksbuchstaben für Quelle und Ziel entfernen
subst %LWdelquelle% /D > NUL
net use %LWdelquelle% /Delete > NUL
subst %LWdelZiel% /D > NUL
net use %LWdelquelle% /Delete > NUL


:: Jetzt die Dateien die von Quelle nach Ziel kopieren
xcopy %Quelle% %Ziel% /v /f /d /s /e /r /y /z /i

miniversum
Member: RamboJay
RamboJay Aug 10, 2006 at 11:01:07 (UTC)
Goto Top
HI
warum so kompliziert??
Ich würde es entweder mit Robocopy oder Beyond Compare lösen.
Beide können Berichte erzeugen und Netzwerkpfade benutzen (\\server\pfad....)

Bei fragen zu den meld dich einfach.
Member: Biber
Biber Aug 10, 2006 at 11:20:47 (UTC)
Goto Top
@jason
warum so kompliziert??
Weil es übt....

War doch mehr eine hypothetische Frage (s.o), weil irgendwer geschrieben hatte, "das geht mit Batch nicht..."

Dass es nicht nötig gewesen wäre, dieses Rad noch mal zu erfinden - keine Frage.
Aber hilf- und lehrreich ist es allemal.

Ich finde miniversums Skizze 5 Sterne wert.

Gruß
Biber
Member: miniversum
miniversum Aug 13, 2006 at 14:50:00 (UTC)
Goto Top
Danke Biber

miniversum
Member: Beeman
Beeman Jan 07, 2009 at 11:31:21 (UTC)
Goto Top
Hi miniversum,

dein Batch funktioniert einwandfrei (auch von mir 5 Sterne dafür), allerdings verstehe ich nicht wieso Du am Ende die Laufwerke über subst abmeldest und dann versuchst sie über net use wieder anzusprechen? Habe den Befehlszeilen ein rem vorgestellt und es funktioniert ohne Fehlermeldung. Lass ich die Zeilen als Befehl drin, bekomme ich eine Fehlermeldung! face-wink Oder habe ich da irgendwas übersehen / missverstanden?


:: Laufwerksbuchstaben für Quelle und Ziel entfernen
subst %LWdelquelle% /D > NUL
rem net use %LWdelquelle% /Delete > NUL
subst %LWdelZiel% /D > NUL
rem net use %LWdelquelle% /Delete > NUL



Gruß Beeman
Member: miniversum
miniversum Jan 07, 2009 at 12:46:25 (UTC)
Goto Top
Diese vier Zeilen sind zusammen mit den Zeilen 13,14 und 22,23 zu sehen (ich hab oben mal die Code Formatierung vorgenommen die ich damals anscheinend vergessen hatte).
GANZ korrekt müssten die Zeilen 35 bis 38 auch folgendermaßen lauten:
if (%Quelle:~2,1%)==(:) subst %LWdelquelle% /D > NUL
if (%Quelle:~2,1%)==(\) net use %LWdelquelle% /Delete > NUL
if (%Ziel:~2,1%)==(:) subst %LWdelZiel% /D > NUL
if (%Ziel:~2,1%)==(\) net use %LWdelquelle% /Delete > NUL

Die Funktion dieser Konstruktion ist folgende:
Es werden erst Quell- und Zielverzeichnis als eigene Laufwerksbuchstaben eingebunden. Danach verglichen und gelöscht was zu viel ist und anschließend die Laufwerksbuchstaben wieder freigegeben.
Ist nun das Quell- bzw. Zielverzeichnis ein lokales Verzeichnis wird es über den Subst Befehl mit einem eigenen Laufwerksbuchstaben belegt. Ist allerdings das Quell- bzw. Zielverzeichnis ein Netzlaufwerk ist dafür der net use Befehl notwendig. Um diese Unterscheidung zu machen ist die If Abfrage drin. Hier wird kontrolliert ob das zweite Zeichen der Pfadangebe ein : oder ein \ ist. Diese Unterscheidung sollte eigentlich auch beim freigeben der Laufwerksbuchstaben gemacht werden.
Ich habe das allerdings vernachlässigt da es die Funktion nicht beeinträchtigt.
Wäre ein lokales Verzeichnis angegeben worden würde der Laufwerksbuchstabe mit subst wieder freigegeben werden. Würde danach der net use Befehl diesen Laufwerksbuchstaben noch einmal freigeben wollen käme zwar eine Fehlermeldung, die Ausführung würde allerdings nicht scheitern.
Wäre umgekehrt ein Netzlaufwerk angegeben worden würde der subst Befehl zum freigeben fehlschlagen und eine Fehlermeldung wäre zu sehen. Der net use Befehl würde allerdings ausgeführt werden und der Ablauf würde wieder funktionieren.
Wenn Du also sagst das du nie Netzlaufwerke syncronisieren willst sondern immer nur lokale Verzeichnisse kannst du alle net use Befehle entfernen / auskommentieren. Wenn dich die Fehlermeldung beim freigeben der Laufwerke stört (zwei werden so auf jeden Fall zu sehen sein sonst) kannst du das umgehen indem du die Abfrage wie oben im Code dort einbaust.
Member: Beeman
Beeman Jan 12, 2009 at 09:08:25 (UTC)
Goto Top
Hi miniversum,

wow, bin echt begeistert. Ein riesiges DANKE für deine schnelle und vor allem ausführliche Antwort. So konnte ich das ganze nicht nur umsetzen, sondern auch ein bißchen besser verstehen.

Gruß Beeman
Member: miniversum
miniversum Jan 12, 2009 at 17:05:00 (UTC)
Goto Top
Wenn Du noch Fragen hast frag ruhig.
Die Batch macht im Prinzip genau das was man händisch tun würde.
1. Vergleichen der Verzeichnisse und löschen der Dateien und Unterordner im Ziel die in er Quelle nicht existieren. (Das Einbinden als Laufwerke mit Subst bzw. net use ist notwendig für diesen Vergleich.)
2. Kopieren der dateien von der Quelle ins Ziel die im Ziel nciht existieren oder älter sind als die in der Quelle. (das macht das xcopy mit dem /d Parameter.