Dateien für Synchronisation löschen (.cmd)
Hi,
folgendes Problem:
nach langer recherche steht fest das robocopy die synchronisation gelöschter dateien (beidseitig) nicht durchführen kann.
darum möchte ich vor der eigentlichen Synchronisation mit robocopy mittels .cmd die gelöschten Dateien jeweils auf beiden Seiten löschen lassen.
Dafür mache ich mit robocopy zunächst ein backup (beidseitig).
Jetzt muss das script kommen, wie folgt:
Ist die Datei aus dem Backup-Q (Quelle) im eigentlichen Sync Ordner der Quelle nicht mehr vorhanden dann lösche die Datei aus dem Sync Ordner des Ziels und aus dem Backup des Ziels. Ansonsten mach nix und geh zur nächsten Datei im Backup-Q.
und das ganze noch mal aber dann ebend von der anderen Seite.
Leider hab ich da so meine Schwierigkeiten mit ner .cmd. Schon allein weil es ja um viele Verzeichnisse mit Dateien geht.
Wäre net wenn hier einer ein paar Zeilen posten könnte.
thx u. cu sentinel
(schon vorab, ich kann aus verschiedenen Gründen nur robocopy nutzen)
folgendes Problem:
nach langer recherche steht fest das robocopy die synchronisation gelöschter dateien (beidseitig) nicht durchführen kann.
darum möchte ich vor der eigentlichen Synchronisation mit robocopy mittels .cmd die gelöschten Dateien jeweils auf beiden Seiten löschen lassen.
Dafür mache ich mit robocopy zunächst ein backup (beidseitig).
Jetzt muss das script kommen, wie folgt:
Ist die Datei aus dem Backup-Q (Quelle) im eigentlichen Sync Ordner der Quelle nicht mehr vorhanden dann lösche die Datei aus dem Sync Ordner des Ziels und aus dem Backup des Ziels. Ansonsten mach nix und geh zur nächsten Datei im Backup-Q.
und das ganze noch mal aber dann ebend von der anderen Seite.
Leider hab ich da so meine Schwierigkeiten mit ner .cmd. Schon allein weil es ja um viele Verzeichnisse mit Dateien geht.
Wäre net wenn hier einer ein paar Zeilen posten könnte.
thx u. cu sentinel
(schon vorab, ich kann aus verschiedenen Gründen nur robocopy nutzen)
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 61237
Url: https://administrator.de/forum/dateien-fuer-synchronisation-loeschen-cmd-61237.html
Ausgedruckt am: 22.04.2025 um 10:04 Uhr
50 Kommentare
Neuester Kommentar

wenn robocopy gelöschte dateien nich syncronisiert, warum muss man sie dann vorher löschen.
Versuchs mal so:
miniversum
set "quelle=d:\quelle"
set "ziel=d:\ziel"
REM Für Verzeichnisse
for /F "delims=: tokens=2" %%a in ('dir /s /b /ad "%ziel%"') do if NOT exist "%quelle%\%%a"\NUL RD /Q /S "%ziel%%%a"
REM Für Dateien
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %ziel%') do if NOT exist "%quelle%\%%a" del /Q /S "%ziel%%%a"
miniversum

hab da was anders verstanden - wer dann ziehmlich schizo gewesen.
was passiert dann eigentlich, wenn auf seite A die datei glelöscht wurde
und auf seite B die selbe geupdatet wurde (oder von mir aus auch genau
umgekehrt)? würde dann nich was schieflaufen oder seh ich schon wieder
den wald vor lauter bäumen nich.
... oder is dat für den vorliegenden fall nich relevant, weil es nich im bereich
des möglichen liegt.
was passiert dann eigentlich, wenn auf seite A die datei glelöscht wurde
und auf seite B die selbe geupdatet wurde (oder von mir aus auch genau
umgekehrt)? würde dann nich was schieflaufen oder seh ich schon wieder
den wald vor lauter bäumen nich.
... oder is dat für den vorliegenden fall nich relevant, weil es nich im bereich
des möglichen liegt.
Also:
Um dieses Problem erklären hier die Lösung.
Die syncronisation geht nur in eine Richtung. Du willst also %ziel% auf den gleichen Stand wie %quelle% bringen.
Das von mir gepostete war ja nur der Löschteil. DAVOR kommt der Kopierteil. Nach dem kopieren gibt es ja alle Dateien die upgedatet wurden und so braucht auch keine davon mehr gelöscht werden.
Als ganzes würde es also so aussehen:
Wenn du mal schaust, hier im Bereich Batch und Shell gibt es auch eine quick n dirty Lösung von Biber glaube ich zur syncronisation.
Eine beidseitige syncronisation würde ja bedeuten das du unterscheiden mußt ob eine Datei zuerst gelöscht oder geupdatet wurde auf den beiden jeweiligen Seiten. Du müßtest also jede Löschaktion mitloggen um diese Zeiten dan vergleichen zu können. Du kannst nur eben in eine richtung syncronisieren oder das löschen weglassen im Zweifelsfall.
miniversum
Um dieses Problem erklären hier die Lösung.
Die syncronisation geht nur in eine Richtung. Du willst also %ziel% auf den gleichen Stand wie %quelle% bringen.
Das von mir gepostete war ja nur der Löschteil. DAVOR kommt der Kopierteil. Nach dem kopieren gibt es ja alle Dateien die upgedatet wurden und so braucht auch keine davon mehr gelöscht werden.
Als ganzes würde es also so aussehen:
set "quelle=d:\quelle"
set "ziel=d:\ziel"
REM Kopieren
xcopy "%quelle%" "%ziel%" /c /s /e /r /v /d /y /i /h /f /o /x
REM Nicht existierende Verzeichnisse löschen
for /F "delims=: tokens=2" %%a in ('dir /s /b /ad "%ziel%"') do if NOT exist "%quelle%\%%a"\NUL RD /Q /S "%ziel%%%a"
REM Nicht existierende Dateien löschen
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %ziel%') do if NOT exist "%quelle%\%%a" del /Q /S "%ziel%%%a"
Wenn du mal schaust, hier im Bereich Batch und Shell gibt es auch eine quick n dirty Lösung von Biber glaube ich zur syncronisation.
Eine beidseitige syncronisation würde ja bedeuten das du unterscheiden mußt ob eine Datei zuerst gelöscht oder geupdatet wurde auf den beiden jeweiligen Seiten. Du müßtest also jede Löschaktion mitloggen um diese Zeiten dan vergleichen zu können. Du kannst nur eben in eine richtung syncronisieren oder das löschen weglassen im Zweifelsfall.
miniversum
Ok dan mach ich mal die Skitze vonmeinem Code nicht mit den Variabeln quelle und ziel sondern mit den von Dir verwendeten Bezeichnungen...
ich hoffe das hilft dir weiter
miniversum
:: Es erfolgt das Entfernen aus SyncOrdner
SeiteB von den Dateien die im SyncOrdner
SeiteA gelöscht wurden:
d.h. Ist die Datei aus Backup SeiteA nicht
mehr in SyncOrdner SeiteA vorhanden dann
lösche diese im SyncOrdner SeiteB.
SeiteB von den Dateien die im SyncOrdner
SeiteA gelöscht wurden:
d.h. Ist die Datei aus Backup SeiteA nicht
mehr in SyncOrdner SeiteA vorhanden dann
lösche diese im SyncOrdner SeiteB.
REM Nicht existierende Verzeichnisse löschen
for /F "delims=: tokens=2" %%a in ('dir /s /b /ad "%BackupSeiteA%"') do if NOT exist "%SyncOrdnerSeiteA%\%%a"\NUL RD /Q /S "%SyncOrdnerSeiteB%%%a"
REM Nicht existierende Dateien löschen
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %BackupSeiteA%') do if NOT exist "%SyncOrdnerSeiteA%\%%a" del /Q /S "%SyncOrdnerSeiteB%%%a"
:: Es erfolgt das Entfernen aus SyncOrdner
SeiteA von den Dateien die im SyncOrdner
SeiteB gelöscht wurden:
d.h. Ist die Datei aus Backup SeiteB nicht
mehr in SyncOrdner SeiteB vorhanden dann
lösche diese im SyncOrdner SeiteA.
SeiteA von den Dateien die im SyncOrdner
SeiteB gelöscht wurden:
d.h. Ist die Datei aus Backup SeiteB nicht
mehr in SyncOrdner SeiteB vorhanden dann
lösche diese im SyncOrdner SeiteA.
REM Nicht existierende Verzeichnisse löschen
for /F "delims=: tokens=2" %%a in ('dir /s /b /ad "%BackupSeiteB%"') do if NOT exist "%SyncOrdnerSeiteB%\%%a"\NUL RD /Q /S "%SyncOrdnerSeiteA%%%a"
REM Nicht existierende Dateien löschen
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %BackupSeiteB%') do if NOT exist "%SyncOrdnerSeiteB%\%%a" del /Q /S "%SyncOrdnerSeiteA%%%a"
ich hoffe das hilft dir weiter
miniversum
Welcher Pfad wird mitgenommen?
gehts so?
miniversum
gehts so?
REM Nicht existierende Verzeichnisse löschen
for /F "delims=: tokens=2" %%a in ('dir /s /b /ad "%BackupSeiteA%"') do if NOT exist "%SyncOrdnerSeiteA%\%%a"\NUL RD /Q /S "%SyncOrdnerSeiteB%%%~nxa"
REM Nicht existierende Dateien löschen
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %BackupSeiteA%') do if NOT exist "%SyncOrdnerSeiteA%\%%a" del /Q /S "%SyncOrdnerSeiteB%%%~nxa"
for /F "delims=: tokens=2" %%a in ('dir /s /b /ad "%BackupSeiteA%"') do if NOT exist "%SyncOrdnerSeiteA%\%%a"\NUL RD /Q /S "%SyncOrdnerSeiteB%%%~nxa"
REM Nicht existierende Dateien löschen
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %BackupSeiteA%') do if NOT exist "%SyncOrdnerSeiteA%\%%a" del /Q /S "%SyncOrdnerSeiteB%%%~nxa"
miniversum
Achhab ja ganz übersehen das das %SEITEB% bei dir ein Netzlaufwerk ist.
Ich habe diese Schematik für ein Laufwerk gemacht die einen Buchstaben am Anfang hat, bzw. davon ausgeht das das Laufwerk auf einen Buchstaben gemapt wurde.
Ich hatte das ganze mal in einem ähnlichen Zusammenhang zum Syncronisieren verwendet (vielleicht hilfts ja):
miniversum
Ich habe diese Schematik für ein Laufwerk gemacht die einen Buchstaben am Anfang hat, bzw. davon ausgeht das das Laufwerk auf einen Buchstaben gemapt wurde.
Ich hatte das ganze mal in einem ähnlichen Zusammenhang zum Syncronisieren verwendet (vielleicht hilfts ja):
@echo off
set src=F:\quelle
set dst=F:\ziel
set log="F:\SyncLog %date%.txt"
echo Log vom: %Date% %Time% >> %log%
echo Dateien werden kopiert: >> %log%
if %src:~-1%==\ set src=%src:~0,-1%
xcopy "%src%" "%dst%" /c /s /e /r /v /d /y /i /h /f /o /x >> %log%
echo Dateien werden geloescht: >> %log%
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 LWdst=%%L:
Subst %LWdst% "%dst%"
for /R %LWdst%\ %%i in ("*.*") do @FC "%%i" "%src%%%~pnxi" >nul || del /s /q "%%i" && echo %%i>>%log%
Subst %LWdst% /D
miniversum
Ah ups das war ein Fehler von mir. klar. Mit
So wird überprüft ob die dateien unter %BACKUP% auch in %SITEA% enthalten sind und wenn nicht in %SITEA% gelöscht.
%SITEA% enthält dann also keine Dateien mehr die nicht auch in %BACKUP% existieren.
willst du ein Netzlaufwerk einbinden solltest du es als Buchstabe mappen. Sonst funktionier der aufruf so nicht.
Kannst ja grade mit dem Net use, das du sowieso schon drin hast den Buchstaben hinzufügen lassen der nicht belegt ist. Daher auch das Schema was ich schonmal gepostet hatte.
Im ganzen also dan wenns mal lokal geht später auch so:
miniversum
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %BACKUP%') do if NOT exist "%SITEA%\%%a" del /Q /S "%SITEA%%%a"
Sollte es gehen.So wird überprüft ob die dateien unter %BACKUP% auch in %SITEA% enthalten sind und wenn nicht in %SITEA% gelöscht.
%SITEA% enthält dann also keine Dateien mehr die nicht auch in %BACKUP% existieren.
willst du ein Netzlaufwerk einbinden solltest du es als Buchstabe mappen. Sonst funktionier der aufruf so nicht.
Kannst ja grade mit dem Net use, das du sowieso schon drin hast den Buchstaben hinzufügen lassen der nicht belegt ist. Daher auch das Schema was ich schonmal gepostet hatte.
Im ganzen also dan wenns mal lokal geht später auch so:
REM Freien Laufwerksbuschstaben suchen und Netzlaufwerk zuweisen
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 LW=%%L:
net use %LW% \\192.168.0.240\ipc$ xyz /user:xyz
set "SITEA1=E:\Robo1"
set "BACKUP=E:\Robo1Back
set "SITEB1=%LW%\SharedDocs\ziel\"
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %BACKUP%') do if NOT exist "%SITEA%\%%a" del /Q /S "%SITEA%%%a"
...
...
net use %LW% \\192.168.0.240\ipc$ /del
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 LW=%%L:
net use %LW% \\192.168.0.240\ipc$ xyz /user:xyz
set "SITEA1=E:\Robo1"
set "BACKUP=E:\Robo1Back
set "SITEB1=%LW%\SharedDocs\ziel\"
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %BACKUP%') do if NOT exist "%SITEA%\%%a" del /Q /S "%SITEA%%%a"
...
...
net use %LW% \\192.168.0.240\ipc$ /del
miniversum
hi,
ich versuch das problem mal einzugrenzen.
folgendes problem:
bei diesem script:
@echo on
set "SITEA=E:\Robo1"
set "BACKUP=E:\Robo1Back"
set "SITEB=E:\Robo2\"
echo on
REM Nicht existierende Dateien
löschen
for /F "delims=: tokens=2"
%%a in ('dir /s /b /a-d %BACKUP%')
do if NOT exist
"%SITEA%\%%a" del /Q /S
"%SITEB%%%a"
pause
passiert folgendes:
E:\roboscri\Kopie von robocopy 070618>if
NOT exist
"E:\Robo1\\Robo1Back\del.cmd" del
/Q /S
"E:\Robo2\\Robo1Back\del.cmd"
Das System kann die angegebene Datei nicht
finden.
Es wird immer \\Robo1Back mit in den Pfad
übernommen. Aber warum bzw. wie kann ich
das abstellen?
cu sentinel
ich versuch das problem mal einzugrenzen.
folgendes problem:
bei diesem script:
@echo on
set "SITEA=E:\Robo1"
set "BACKUP=E:\Robo1Back"
set "SITEB=E:\Robo2\"
echo on
REM Nicht existierende Dateien
löschen
for /F "delims=: tokens=2"
%%a in ('dir /s /b /a-d %BACKUP%')
do if NOT exist
"%SITEA%\%%a" del /Q /S
"%SITEB%%%a"
pause
passiert folgendes:
E:\roboscri\Kopie von robocopy 070618>if
NOT exist
"E:\Robo1\\Robo1Back\del.cmd" del
/Q /S
"E:\Robo2\\Robo1Back\del.cmd"
Das System kann die angegebene Datei nicht
finden.
Es wird immer \\Robo1Back mit in den Pfad
übernommen. Aber warum bzw. wie kann ich
das abstellen?
cu sentinel
So jetzt hab ichs bei mir durchgespielt und jetzt nochmal von vorne und dem ersten Ansatz überhaubt. (Ich komm ja schon selbst durcheinander.)
Also:
Dein Sets sehen so aus:
set "SITEA=E:\Robo1"
set "BACKUP=E:\Robo1Back"
set "SITEB=E:\Robo2"
set "BACKUP=E:\Robo1Back"
set "SITEB=E:\Robo2"
dann funktioniert es so:
Vergleiche die Liste der die Verzeichnisse in %BACKUP% mit denen in %SITEA%. Existiert in %SITEA% ein Verzeichnis nicht das es in %BACKUP% gibt, dann lösche dieses Verzeichnis auch in %SITEB%. Der code dazu lautet:
for /F "delims=: tokens=2" %%a in ('dir /s /b /ad "%BACKUP%"') do if NOT exist "%SITEA%\%%a"\NUL RD /Q /S "%SITEB%\%%a"
Das gleiche für Dateien:for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %BACKUP%') do if NOT exist "%SITEA%\%%a" del /Q /S "%SITEB%\%%a"
Hier wird jetzt davon ausgegangen das alle Pfade direkt als Laufwerke vorliegen.
Das erreicht du indem Du davor das hier machst:
:: SITEA 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 LWSITEA=%%L:
if %LWSITEA%.==. (
echo.
echo FEHLER: Auf Ihrem System existiert kein freier Laufwerksbuchstabe.
Pause
goto:eof
)
if (%SITEA:~2,1%)==(:) subst %LWSITEA% %SITEA% > NUL
if (%SITEA:~2,1%)==(\) net use %LWSITEA% %SITEA% > NUL
:: BACKUP 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 LWBACKUP=%%L:
if %LWBACKUP%.==. (
echo.
echo FEHLER: Auf Ihrem System existiert kein freier Laufwerksbuchstabe.
Pause
goto:eof
)
if (%BACKUP:~2,1%)==(:) subst %LWBACKUP% %BACKUP% > NUL
if (%BACKUP:~2,1%)==(\) net use %LWBACKUP% %BACKUP% > NUL
:: SITEB 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 LWSITEB=%%L:
if %LWSITEB%.==. (
echo.
echo FEHLER: Auf Ihrem System existiert kein freier Laufwerksbuchstabe.
Pause
goto:eof
)
if (%SITEB:~2,1%)==(:) subst %LWSITEB% %SITEB% > NUL
if (%SITEB:~2,1%)==(\) net use %LWSITEB% %SITEB% > NUL
und am Ende kannst du das dan wieder entfernen mit:
subst %LWSITEA% /D > NUL
net use %LWSITEA% /Delete > NUL
subst %LWBACKUP% /D > NUL
net use %LWBACKUP% /Delete > NUL
subst %LWSITEB% /D > NUL
net use %LWSITEB% /Delete > NUL
net use %LWSITEA% /Delete > NUL
subst %LWBACKUP% /D > NUL
net use %LWBACKUP% /Delete > NUL
subst %LWSITEB% /D > NUL
net use %LWSITEB% /Delete > NUL
Im Ganzen gibt das also dann sowas:
@echo off
set "SITEA=E:\Robo1"
set "BACKUP=E:\Robo1Back"
set "SITEB=E:\Robo2"
:: ---------------------Verzeichnisse aus Laufwerke einbinden -----------------------------------
:: SITEA 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 LWSITEA=%%L:
if %LWSITEA%.==. (
echo.
echo FEHLER: Auf Ihrem System existiert kein freier Laufwerksbuchstabe.
Pause
goto:eof
)
if (%SITEA:~2,1%)==(:) subst %LWSITEA% %SITEA% > NUL
if (%SITEA:~2,1%)==(\) net use %LWSITEA% %SITEA% > NUL
:: BACKUP 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 LWBACKUP=%%L:
if %LWBACKUP%.==. (
echo.
echo FEHLER: Auf Ihrem System existiert kein freier Laufwerksbuchstabe.
Pause
goto:eof
)
if (%BACKUP:~2,1%)==(:) subst %LWBACKUP% %BACKUP% > NUL
if (%BACKUP:~2,1%)==(\) net use %LWBACKUP% %BACKUP% > NUL
:: SITEB 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 LWSITEB=%%L:
if %LWSITEB%.==. (
echo.
echo FEHLER: Auf Ihrem System existiert kein freier Laufwerksbuchstabe.
Pause
goto:eof
)
if (%SITEB:~2,1%)==(:) subst %LWSITEB% %SITEB% > NUL
if (%SITEB:~2,1%)==(\) net use %LWSITEB% %SITEB% > NUL
:: ----------------------- Verzeichnisse und Dateien loeschen ------------------------
for /F "delims=: tokens=2" %%a in ('dir /s /b /ad "%LWBACKUP%"') do if NOT exist "%LWSITEA%\%%a"\NUL RD /Q /S "%LWSITEB%\%%a"
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %LWBACKUP%') do if NOT exist "%LWSITEA%\%%a" del /Q /S "%LWSITEB%\%%a"
:: ------------------------------ Laufwerke Freigeben ------------------------------------
subst %LWSITEA% /D > NUL
net use %LWSITEA% /Delete > NUL
subst %LWBACKUP% /D > NUL
net use %LWBACKUP% /Delete > NUL
subst %LWSITEB% /D > NUL
net use %LWSITEB% /Delete > NUL
Nach diesem Teil kommen dann die Kopieropperationen.
Das sollte dann auch mit Netzzlaufwerken funktionieren.
miniversum
Edit: Ach sowas Doofes. Ich sah grade.. Also sie Smilies sollen eigentlich Doppelpunkte und geschlossene Klammern sein. Also wie das (\) nur mit : statt \
Edit2: Unterverzeichnisse der Laufwerksbuchstaben werden verglichen.
Genau!
Das ist der Trick an der Sache das du dann keine Unterverzeichnisse mehr hast sondern alles als Laufwerksbuchstaben. Egal ob Netzlaufwerk oder lokal.
Durch das "delims=: tokens=2" in der Forschleife verwende ich allerdings nur den Teil NACH dem : Dadurch ist das Vergleichen der Verzeichnisse wesentlich einfacher.
Ich habs auch doof erklärt. Bin halt ncith so gut im Erklären.
miniversum
Das ist der Trick an der Sache das du dann keine Unterverzeichnisse mehr hast sondern alles als Laufwerksbuchstaben. Egal ob Netzlaufwerk oder lokal.
Durch das "delims=: tokens=2" in der Forschleife verwende ich allerdings nur den Teil NACH dem : Dadurch ist das Vergleichen der Verzeichnisse wesentlich einfacher.
Ich habs auch doof erklärt. Bin halt ncith so gut im Erklären.
miniversum
Oh mir ist grade ein Fehler aufgefallen. Das hab ich ja ganz übersehen.
ändere mal das
So dürfte das dann auch eingentlich nicht passieren, da der Vergleich ja inklusive der Unterverzeichnisse stattfindet. Oder hast du das geändert?
Im
miniversum
PS: habs oben auch nochmal korrigiert
ändere mal das
for /F "delims=: tokens=2" %%a in ('dir /s /b /ad "%BACKUP%"') do if NOT exist "%SITEA%\%%a"\NUL RD /Q /S "%SITEB%\%%a"
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %BACKUP%') do if NOT exist "%SITEA%\%%a" del /Q /S "%SITEB%\%%a"
infor /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %BACKUP%') do if NOT exist "%SITEA%\%%a" del /Q /S "%SITEB%\%%a"
for /F "delims=: tokens=2" %%a in ('dir /s /b /ad "%LWBACKUP%"') do if NOT exist "%LWSITEA%\%%a"\NUL RD /Q /S "%LWSITEB%\%%a"
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %LWBACKUP%') do if NOT exist "%LWSITEA%\%%a" del /Q /S "%LWSITEB%\%%a"
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %LWBACKUP%') do if NOT exist "%LWSITEA%\%%a" del /Q /S "%LWSITEB%\%%a"
So dürfte das dann auch eingentlich nicht passieren, da der Vergleich ja inklusive der Unterverzeichnisse stattfindet. Oder hast du das geändert?
Im
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %LWBACKUP%') do if NOT exist "%LWSITEA%\%%a" del /Q /S "%LWSITEB%\%%a"
wird ja dann über das 'dir /s /b /a-d %BACKUP%' eine Liste erzeugt die so aussieht:K:\Neu Bitmap.bmp
K:\Neuer Ordner\hier\Neu Bitmap.bmp
K:\Neuer Ordner (2)\Neuer Ordner\Neuer Ordner\Neuer Ordner\Neu Bitmap.bmp
und durch das "delims=: tokens=2" wird nur der hintere Teil verwendet und der andere Laufwerksbuchstabe davorgehängt. Also so:K:\Neuer Ordner\hier\Neu Bitmap.bmp
K:\Neuer Ordner (2)\Neuer Ordner\Neuer Ordner\Neuer Ordner\Neu Bitmap.bmp
L:\Neu Bitmap.bmp
L:\Neuer Ordner\hier\Neu Bitmap.bmp
L:\Neuer Ordner (2)\Neuer Ordner\Neuer Ordner\Neuer Ordner\Neu Bitmap.bmp
und dann das ganze verglichen.L:\Neuer Ordner\hier\Neu Bitmap.bmp
L:\Neuer Ordner (2)\Neuer Ordner\Neuer Ordner\Neuer Ordner\Neu Bitmap.bmp
miniversum
PS: habs oben auch nochmal korrigiert
Die Umleitung kannst du mit einem angehängten >>log.txt machen (name der Log kanst du ja anpassen)
Das mit dem Problem das gleichnamige gelöscht werden...
Ändere mal testweise die Zeile:
sucht er dann auf dem anderen Laufwerksbuchstaben. Wenn dus genauer willst kannst du ja auch gleich noch die anderen mit ausgeben. Den ganzen Block also so:
miniversum
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %LWBACKUP%') do if NOT exist "%LWSITEA%%%a" del /Q /S "%LWSITEB%%%a">>log.txt
Oder Du erzeugst selbst mit einem echo den Logeintrag. den könntest du dann gestalten wie du willst. das wär dann so:for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %LWBACKUP%') do if NOT exist "%LWSITEA%%%a" (del /Q /S "%LWSITEB%%%a" & echo Die Datei "%LWSITEB%%%a" wurde gelöscht>>log.txt)
Das mit dem Problem das gleichnamige gelöscht werden...
Ändere mal testweise die Zeile:
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %LWBACKUP%') do if NOT exist "%LWSITEA%%%a" del /Q /S "%LWSITEB%%%a"
in diese Zeilen um:dir /s /b /a-d %LWBACKUP%>LWBACKUPAuB.txt
for /F "delims=: tokens=2" %%a in ('type LWBACKUPAuB.txt') do if NOT exist "%LWSITEA%%%a" del /Q /S "%LWSITEB%%%a"
Hier solltest du dan in der Datei LWBACKUPAuB.txt sehen können was drinsteht. udn diese Dateien (nach dem for /F "delims=: tokens=2" %%a in ('type LWBACKUPAuB.txt') do if NOT exist "%LWSITEA%%%a" del /Q /S "%LWSITEB%%%a"
dir /s /b /a-d %LWBACKUP%>LWBACKUP.txt
dir /s /b /a-d %LWSITEA%>LWSITEA.txt
dir /s /b /a-d %LWSITEB%>LWSITEB.txt
for /F "delims=: tokens=2" %%a in ('type LWBACKUPAuB.txt') do if NOT exist "%LWSITEA%%%a" del /Q /S "%LWSITEB%%%a"
dir /s /b /a-d %LWSITEA%>LWSITEA.txt
dir /s /b /a-d %LWSITEB%>LWSITEB.txt
for /F "delims=: tokens=2" %%a in ('type LWBACKUPAuB.txt') do if NOT exist "%LWSITEA%%%a" del /Q /S "%LWSITEB%%%a"
miniversum
Hi,
thx für die loggeschichte. ich hab da
viel zu kompliziert gedacht.
aber zum eigentlichen Problem:
meintest Du das so oder wie?
dir /s /b /a-d %LWBACKUP%>LWBACKUPAuB.txt
dir /s /b /a-d %LWSITEA%>LWSITEA.txt
dir /s /b /a-d %LWSITEB%>LWSITEB.txt
for /F "delims=: tokens=2" %%a in ('type LWBACKUPAuB.txt') do if NOT exist "%LWSITEA%%%a" del /Q /S "%LWSITEB%%%a"
cu sentinel
thx für die loggeschichte. ich hab da
viel zu kompliziert gedacht.
aber zum eigentlichen Problem:
meintest Du das so oder wie?
dir /s /b /a-d %LWBACKUP%>LWBACKUPAuB.txt
dir /s /b /a-d %LWSITEA%>LWSITEA.txt
dir /s /b /a-d %LWSITEB%>LWSITEB.txt
for /F "delims=: tokens=2" %%a in ('type LWBACKUPAuB.txt') do if NOT exist "%LWSITEA%%%a" del /Q /S "%LWSITEB%%%a"
cu sentinel
Ja genau so mein ichs. So kannst du in den Dateien dan sehen was er wirklich ausliest udn vergleicht.
Wenns danach nochncith geht kansnt du die Drei Dateien posten. Es solten alle Drei in der art aussehen das sowas drinsteht:
K:\Neu Bitmap.bmp
K:\Neuer Ordner\hier\Neu Bitmap.bmp
K:\Neuer Ordner (2)\Neuer Ordner\Neuer Ordner\Neuer Ordner\Neu Bitmap.bmp
K:\Neuer Ordner\hier\Neu Bitmap.bmp
K:\Neuer Ordner (2)\Neuer Ordner\Neuer Ordner\Neuer Ordner\Neu Bitmap.bmp
miniversum
hi,
wenn ich nerv sag bescheid ;)
beim feintuning:
ich möchte gerne ab einer bestimmten
ping zahl den prozess weiterlaufen lassen.
sollte die Anzahl der pings nicht erreicht
werden (= noch wacklige verbindung) dann lass
nochmal die anzahl der pingsdurchlaufen.
irgendwie raff ich das nicht mit dem goto neu
.
cu sentinel
wenn ich nerv sag bescheid ;)
beim feintuning:
ich möchte gerne ab einer bestimmten
ping zahl den prozess weiterlaufen lassen.
sollte die Anzahl der pings nicht erreicht
werden (= noch wacklige verbindung) dann lass
nochmal die anzahl der pingsdurchlaufen.
irgendwie raff ich das nicht mit dem goto neu
.
> set "host1=192.168.0.240" &
> set "logdatei=logPing.txt"
>
> :neu
> ping -n 20 %host1%<nul && goto
> neu
>
> echo Kann %host1% nicht erreichen! Schreibe
> Log in %logdatei%
> echo ***PING_TEST*** >> %logdatei%
> echo Keine Verbindung zu %host1% am %date%
> um %time% >> %logdatei%
>
cu sentinel
Willst du nur eine einzige Wiederholung oder das es solange wiederholt wird bis die Verbindung gut ist? Also so wie dus machen willst würde es solange die Pings wiederholen bis die 20 Pings alle Durchkommen. Ungetestet, versuchs dann mal so:
set "host1=192.168.0.240" & set "logdatei=logPing.txt"
:neu
ping -n 20 %host1%>nul
if not %errorlevel% equ 0 (
echo Kann %host1% nicht erreichen! Schreibe Log in %logdatei%
echo ***PING_TEST*** >> %logdatei%
echo Keine Verbindung zu %host1% am %date% um %time% >> %logdatei%
goto:neu
)
set "host1=192.168.0.240" & set "logdatei=logPing.txt"
ping -n 20 %host1%>nul
if not %errorlevel% ping -n 20 %host1%>nul
if not %errorlevel% equ 0 (
echo Kann %host1% nicht erreichen! Schreibe Log in %logdatei%
echo ***PING_TEST*** >> %logdatei%
echo Keine Verbindung zu %host1% am %date% um %time% >> %logdatei%
goto:Abbruch
)
miniversum
Hmm merkwürdig.
MAch mal aus der Ursprünglichen Zeile
miniversum
MAch mal aus der Ursprünglichen Zeile
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %LWBACKUP%') do if NOT exist "%LWSITEA%%%a" del /Q /S "%LWSITEB%%%a"
diese:for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %LWBACKUP%') do (
echo [%%a][%%~pnxa][%LWSITEA%%%~pnxa][%LWSITEB%%%~pnxa]>>debuglog.txt
if NOT exist "%LWSITEA%%%~pnxa" (del /Q /S "%LWSITEB%%%~pnxa" && echo geloescht>>debuglog.txt) else (echo nicht geloescht>>debuglog.txt)
)
und poste bitte mal was dann in der Datei debuglog.txt stehtecho [%%a][%%~pnxa][%LWSITEA%%%~pnxa][%LWSITEB%%%~pnxa]>>debuglog.txt
if NOT exist "%LWSITEA%%%~pnxa" (del /Q /S "%LWSITEB%%%~pnxa" && echo geloescht>>debuglog.txt) else (echo nicht geloescht>>debuglog.txt)
)
miniversum
ok dann versuchs so:
miniversum
set "host1=192.168.0.240" & set "logdatei=logPing.txt"
:neu
FOR /F "tokens=10 delims= " %%i in ('ping -n 20 %host1%^|find "Verloren"') do set errorlevel=%%i
if not %errorlevel% equ 0 (
echo Kann %host1% nicht erreichen! Schreibe Log in %logdatei%
echo *PING_TEST* >> %logdatei%
echo Keine Verbindung zu %host1% am %date% um %time% >> %logdatei%
goto:neu
)
hier hat dan errorlevel die Anzahl der Verlorenen Packete. ist also Errorlevel=0 ging auch nichts verloren.:neu
FOR /F "tokens=10 delims= " %%i in ('ping -n 20 %host1%^|find "Verloren"') do set errorlevel=%%i
if not %errorlevel% equ 0 (
echo Kann %host1% nicht erreichen! Schreibe Log in %logdatei%
echo *PING_TEST* >> %logdatei%
echo Keine Verbindung zu %host1% am %date% um %time% >> %logdatei%
goto:neu
)
miniversum
In der Fehlermeldung nicht. bzw. da gibts ja nicht direkt ne Fehlermeldung.
Beim Ping steht am ende ja immer eine Zeile inder steht wwieviele der Packete Empfangen und wieviele Verloren wurden. Diese Zeile sucht ich mit dem Find. Die For-Schleife zerlegt diese Zeile dann und schreibt den Wert der bei "Verloren" in die Variable errorlevel. Daher steht dort im errorlevel auch 0 wenn alles gut ging und wenn nicht die Anzahl der Verlorenen Packete.
miniversum
Beim Ping steht am ende ja immer eine Zeile inder steht wwieviele der Packete Empfangen und wieviele Verloren wurden. Diese Zeile sucht ich mit dem Find. Die For-Schleife zerlegt diese Zeile dann und schreibt den Wert der bei "Verloren" in die Variable errorlevel. Daher steht dort im errorlevel auch 0 wenn alles gut ging und wenn nicht die Anzahl der Verlorenen Packete.
miniversum
Also jetzt kapier ichs echt nicht. Im debuglog.txt steht ja nur bei der ersten datei (\Neu Bitmap.bmp) gelöscht. bei den restlichen allen nicht gelöscht. Aber er hat trotzdem was anderes gemacht?
mach mal aus den Jetzigen Zeilen:
miniversum
mach mal aus den Jetzigen Zeilen:
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %LWBACKUP%') do (
echo [%%a][%%~pnxa][%LWSITEA%%%~pnxa][%LWSITEB%%%~pnxa]>>debuglog.txt
if NOT exist "%LWSITEA%%%~pnxa" (del /Q /S "%LWSITEB%%%~pnxa" && echo geloescht>>debuglog.txt) else (echo nicht geloescht>>debuglog.txt)
)
folgende:echo [%%a][%%~pnxa][%LWSITEA%%%~pnxa][%LWSITEB%%%~pnxa]>>debuglog.txt
if NOT exist "%LWSITEA%%%~pnxa" (del /Q /S "%LWSITEB%%%~pnxa" && echo geloescht>>debuglog.txt) else (echo nicht geloescht>>debuglog.txt)
)
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %LWBACKUP%') do (
if NOT exist "%LWSITEA%%%a" (del /Q /S "%LWSITEB%%%a">>debuglog.txt) else (echo %LWSITEB%%%a" nicht geloescht>>debuglog.txt)
)
und poste mal bitte die debuglog.txtif NOT exist "%LWSITEA%%%a" (del /Q /S "%LWSITEB%%%a">>debuglog.txt) else (echo %LWSITEB%%%a" nicht geloescht>>debuglog.txt)
)
miniversum
ups
ich merk grade...
Der Fehler liegt wo anders. Hab ich die ganze Zeit übersehen.
Ändere mal in deiner Ursprünglichen Zeile:
miniversum
ich merk grade...
Der Fehler liegt wo anders. Hab ich die ganze Zeit übersehen.
Ändere mal in deiner Ursprünglichen Zeile:
for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %LWBACKUP%') do if NOT exist "%LWSITEA%%%a" del /Q /S "%LWSITEB%%%a"
die Parameter nach dem del. Lass sie ganz weg. also so:for /F "delims=: tokens=2" %%a in ('dir /s /b /a-d %LWBACKUP%') do if NOT exist "%LWSITEA%%%a" del "%LWSITEB%%%a"
miniversum