koenigdaniel
Goto Top

Robocopy mehrfach in einer Schleife ausführen

Hallo,

ich habe ein Batch Skript geschreiben, indem verschiedene Verzeichnisse auf eine Externe USB-Platte gespiegelt werden.

Bisher geben ich die Verzeichnisse am Anfang der Batch ein.
Hier einmal meine Batch
@echo off
::+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
:: Script zur Sicherung von Dateien (für WinXP)
::
::	-Automatisches Sichern von Daten auf Externe Festplatte
::	-Schreiben von Logfiles
::	-Herunterfahren des Rechners	
:: 
:: Version 1.0
:: Daniel König 25.06.2007
:: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

:: Variabelendeklaration:

:: Arbeitsverzeichnis in dem das Script liegt
set workpath=C:ToolsSicherung

:: Laufwerksbuchstabe der externen Festplatte
set ziellaufwerk=W:

:: Datenquelle 1
set daten1="Eigene Dateien"  
set quellpfad1=D:TEST1
set zeilpfad1=%ziellaufwerk%TESTEigene Dateien

:: Datenquelle 2
set daten2="Mail"  
set quellpfad2=D:Test2
set zeilpfad2=%ziellaufwerk%TESTMail

:: Datenquelle 3
set daten3="Bilder"  
set quellpfad3=D:Test3
set zeilpfad3=%ziellaufwerk%TESTBilder

:: Datenquelle 4
set daten4="Quicken"  
set quellpfad4=D:Test4
set zeilpfad4=%ziellaufwerk%TESTQuicken

set methode=?

:: Fehlermeldungen für Robocopy
set fehler16=FEHLER!!! Es hat kein Abgelich der Daten stattgefunden, SICHERUNG NICHT ERFOLGREICH!!!!
set fehler8=FEHLER!!! Einige Dateien konnten nicht kopiert werden, bitte Logfile anschauen.
set fehler4=Fehler!!! Beim kopieren wurden gefunden, bitte Logfile anschauen.
set fehler2=Sicherung erfolgreich abgeschlossen, Dateien wurden erfolgreich kopiert, im Zielverzeichnis wurden Dateien gelöscht.
set fehler1=Sicherung erfolgreich abgeschlossen, Dateien wurden erfolgreich kopiert.
set fehler0=Sicherung erfolgreich abgeschlossen, keine geänderte Dateien vorhanden.


:: Logdatei mit Tagesdatum
set tmpbat="%temp%~tmpbat.bat"  
    showdate /f:"yyyymmdd" /p:"set datum="> %tmpbat%  
    call %tmpbat%
    del %tmpbat%
set logfile=%workpath%logfiles\%datum%-logfile.txt

:: Programmbegin
:ANFANG
echo Script zur Sicherung von Dateien
echo.
echo.
echo Wählen sie die Sicherungsmethode aus:
echo sichern                         [s]
echo sichern und PC herunterfahren   [h]
echo beenden                         [q]
echo.
set /p methode="Bitte Auswahl trefen:  "  
echo.
:: Daten sichern
if %methode%== s goto Weiter
:: Daten sichern und PC herunterfahren
if %methode%== h goto Weiter
:: Batch beenden
if %methode%== q goto ENDE
goto WIEDERHOLUNG

:Weiter
:: Test ob externes Laufwerk auch unter angegebenem Laufwerksbuchstaben verfügbar ist.
if not exist %ziellaufwerk% echo Externe Platte (%ziellaufwerk%) angeschaltet??? & goto LW-aendern
goto Aufgabe

:LW-aendern
:: Wenn Ziellaufwerk nicht vorhanden anschalten oder neuen Laufwerksbuchstaben angeben.
echo.
set /p aktuellesLW="Bitte aktuellen LW-Buchstaben der externen Platte angeben [q fuer beeenden]:  "  
if %aktuellesLW%== q goto ENDE
:: tool Remount.exe von Uwe Sieber zum ändern des Laufwerkbuchstabens
if exist %aktuellesLW% ::ount.exe %aktuellesLW% %ziellaufwerk% & goto Aufgabe
:: Schleife bis das Laufwerk gefunden wird.
goto LW-aendern


:Aufgabe
:: Wiedergabe der zu sichernden Daten und die entsprechenden Ziele - 4 Datensätze möglich
echo Folgende Daten werden nach %ziellaufwerk% gesichert:
echo.
echo von:  %quellpfad1% 
echo nach: %zeilpfad1%
echo.
echo von:  %quellpfad2% 
echo nach: %zeilpfad2%
echo.
echo von:  %quellpfad3% 
echo nach: %zeilpfad3%
echo.
echo von:  %quellpfad4% 
echo nach: %zeilpfad4%
echo.
:: Pause damit Quell und Zielpfade gesehen werden.
wait 10


:: Protokollierung des Sicherungsbegins
showdate /f:"dd.mm.yyyy hh:mm:ss" /s:" - Sicherung gestartet"  >> logfiles/sicherung.txt  
showdate /f:"dd.mm.yyyy hh:mm:ss" /s:" - Sicherung gestartet"  > mail.txt  

:: Sicherung Datensatz 1
:Sichern1
if not exist %quellpfad1% set Ausgabe1=Sicherung %daten1% fehlgeschlagen, Quellpfad nicht vorhanden. & goto end1
robocopy.exe /ZB /MIR /NDL /NP /LOG+:"%logfile%" /TEE "%quellpfad1%" "%zeilpfad1%"   
if errorlevel 16 set Ausgabe1=%fehler16% & goto end1
if errorlevel 8  set Ausgabe1=%fehler8% & goto end1
if errorlevel 4  set Ausgabe1=%fehler4% & goto end1
if errorlevel 2  set Ausgabe1=%fehler2% & goto end1
if errorlevel 1  set Ausgabe1=%fehler1% & goto end1
if errorlevel 0  set Ausgabe1=%fehler0% & goto end1
:end1
echo. >>mail.txt
echo Sicherung %daten1%:>>mail.txt 
echo           -%Ausgabe1%>>mail.txt
echo.  >>mail.txt

:: Sicherung Datensatz 2
:Sichern2
if not exist %quellpfad2% set Ausgabe2=Sicherung %daten2% fehlgeschlagen, Quellpfad nicht vorhanden. & goto end2
robocopy.exe /ZB /MIR /NDL /NP /LOG+:"%logfile%" /TEE "%quellpfad2%" "%zeilpfad2%"   
if errorlevel 16 set Ausgabe2=%fehler16% & goto end2
if errorlevel 8  set Ausgabe2=%fehler8% & goto end2
if errorlevel 4  set Ausgabe2=%fehler4% & goto end2
if errorlevel 2  set Ausgabe2=%fehler2% & goto end2
if errorlevel 1  set Ausgabe2=%fehler1% & goto end2
if errorlevel 0  set Ausgabe2=%fehler0% & goto end2
:end2
echo. >>mail.txt
echo Sicherung %daten2%:>>mail.txt 
echo           -%Ausgabe2%>>mail.txt
echo.  >>mail.txt

:: Sicherung Datensatz 3
:Sichern3
if not exist %quellpfad3% set Ausgabe3=Sicherung %daten3% fehlgeschlagen, Ziel nicht vorhanden. & goto end3
robocopy.exe /ZB /MIR /NDL /NP /LOG+:"%logfile%" /TEE "%quellpfad3%" "%zeilpfad3%"   
if errorlevel 16 set Ausgabe3=%fehler16% & goto end3
if errorlevel 8  set Ausgabe3=%fehler8% & goto end3
if errorlevel 4  set Ausgabe3=%fehler4% & goto end3
if errorlevel 2  set Ausgabe3=%fehler2% & goto end3
if errorlevel 1  set Ausgabe3=%fehler1% & goto end3
if errorlevel 0  set Ausgabe3=%fehler0% & goto end3
:end3
echo. >>mail.txt
echo Sicherung %daten3%:>>mail.txt 
echo           -%Ausgabe3%>>mail.txt
echo.  >>mail.txt

:: Sicherung Datensatz 4
:Sichern4
if not exist %quellpfad4% set Ausgabe4=Sicherung %daten4% erfolgreich, Quellpfad nicht vorhanden. & goto end4
robocopy.exe /ZB /MIR /NDL /NP /LOG+:"%logfile%" /TEE "%quellpfad4%" "%zeilpfad4%"   
if errorlevel 16 set Ausgabe4=%fehler16% & goto end4
if errorlevel 8  set Ausgabe4=%fehler8% & goto end4
if errorlevel 4  set Ausgabe4=%fehler4% & goto end4
if errorlevel 2  set Ausgabe4=%fehler2% & goto end4
if errorlevel 1  set Ausgabe4=%fehler1% & goto end4
if errorlevel 0  set Ausgabe4=%fehler0% & goto end4
:end4
echo. >>mail.txt
echo Sicherung %daten4%:>>mail.txt 
echo           -%Ausgabe4%>>mail.txt
echo.  >>mail.txt

:: Ende des Sicherungsvorgangs
showdate /f:"dd.mm.yyyy hh:mm:ss" /s:" + Sicherung beendet"  >> Logfiles/sicherung.txt  
showdate /f:"dd.mm.yyyy hh:mm:ss" /s:" + Sicherung beendet"  >> mail.txt  

:AUSGABE
:: Ausgabe der Errorlevel der Sicherung
echo. >> mail.txt
echo Der Logfile befindet sich unter: %logfile% >> mail.txt
echo. >> mail.txt
type mail.txt
if %methode%== s START %windir%
otepad.exe mail.txt & goto ENDE
if %methode%== h goto Ausschalten


:WIEDERHOLUNG
echo.
echo Die getroffene Auswahl ist falsch!!!
echo Bitte wiederholen Sie ihre Auswahl!!
goto ANFANG 

:Ausschalten
type "%logfile%" >>mail.txt  
cscript.exe sendMail.vbs "--SICHERUNG auf Externe Platte wurde ausgefuehrt--" mail.txt  
WAIT 10
if not %methode%== h goto ENDE
rem psshutdown.exe -k -t 00

:ENDE
exit

Bisher sind es 4 Verzeichnisse die gesichert werden, sollten noch welche hinzukommen muss ich das alles händsich ergänzen.

Mir schwebt vor die Variabelen daten, quellpfad und zeilpfad aus eine txt Datei einzulesen und dann alles in einer Schleife anzuarbeiten.

Leider bekomme ich das mit dem einlesen nicht hin und auch eine Schleife für das robocopy will mir nicht gelingen.

Hat da jemand vielleicht eine Idee????

Die txt Datei mit den Quellen und Zielen dachte ich könnte wie folgt aussehen:

Backup.txt
Daten: "Eigene Dateien"  
Quelle: D:Eigene Dateien
Ziel: %ziellaufwerk%Daten

Daten: "Mail"  
Quelle: D:Mail
Ziel: %ziellaufwerk%Mail

Bin für jede Hilfe dankbar.

Gruß Daniel König

Content-Key: 62656

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

Printed on: May 5, 2024 at 19:05 o'clock

Mitglied: 50240
50240 Jun 29, 2007 at 10:40:46 (UTC)
Goto Top
Mahlzeit!

Das ist eigentlich ganz einfach. Vorausgesetzt, Du hast ein Windows ab XP aufwärts (also auch 2003 Server und höher). Dann kann der Befehl "Call" auch Sprungmarken aufrufen, indem man die Sprungmarke statt einem Dateinamen dahintersetzt:

set humbug=Killefit
call :Unterprogramm

set humbug=Nonsense
call :Unterprogramm

goto :EOF

:Unterprogramm
echo %%humbug%% = "%humbug%"  
goto :EOF

Wichtig ist dabei, dass die Unterprogramme alle bis zum Ende der Datei durchlaufen, also am Besten mit "goto:EOF" abgeschlossen werden, was direkt zum End Of File springt.

Setz also die Variablen, die Deine Quell- und Zielangaben beinhalten, ans Ende des Blocks, der nur einmal durchlaufen werden soll (also alles bis zu den Kopieraktionen) und schreib die Kopieraktion in ein Unterprogramm am Ende des Skripts. Dann kannst Du nach dem Muster hier die Variablen ändern und locker-flockig kopieren lassen, soviel Du willst...
Member: miniversum
miniversum Jun 29, 2007 at 12:16:53 (UTC)
Goto Top
Hallo
Vielleicht hilft die diese Batch weiter. Etwas umbauen das du sie verwenden kannst mußt du selbst:
@echo off 
set file="Backup.txt"  
FOR /F "skip=2 tokens=1 delims=" %%i in ('find /N "Daten:" %file%') do (  

call:auslesen %%i

pause
)

:auslesen
set "Daten="  
set "Quelle="  
set "Ziel="  
set /a offset=%1-1
FOR /F "tokens=1* delims=:" %%a in ('more +%offset% %file%') do if not defined Daten set Daten=%%b  
set /a offset=%offset%+1
FOR /F "tokens=1* delims=:" %%a in ('more +%offset% %file%') do if not defined Quelle set Quelle=%%b  
set /a offset=%offset%+1
FOR /F "tokens=1* delims=:" %%a in ('more +%offset% %file%') do if not defined Ziel set Ziel=%%b  

echo ----------
echo %Daten%
echo %Quelle%
echo %Ziel%
echo ----------

goto:eof

miniversum
Member: koenigdaniel
koenigdaniel Jun 29, 2007 at 16:57:22 (UTC)
Goto Top
Danke für die Hilfe.

Habe den Schnipsel noch ein bisschen angepasst

skript ist jetzt viel schlanker und einfacher zu bedienen

Hier das fertig skript vielleicht hilft es ja jemandem

Gruß Daniel

@echo off
::+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
:: Script zur Sicherung von Dateien (für WinXP)
::
::	-Automatisches Sichern von Daten auf Externe Festplatte
::	-Schreiben von Logfiles
::	-Herunterfahren des Rechners	
:: 
:: Version 1.0
:: Daniel König 28.06.2007
:: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

:: Variabelendeklaration:
:: Arbeitsverzeichnis in dem das Script liegt
set workpath=C:\Tools\Sicherung
:: Datei Backup.txt enhält die zu sichernden Verzeichnisse
set file=Backup.txt
:: Ziellaufwerk
set ziellaufwerk=W:
:: Variable für die angewendete Sicherungsmethode
set methode=?

:: Fehlermeldungen für Robocopy
set fehler16=FEHLER!!! Es hat kein Abgelich der Daten stattgefunden, SICHERUNG NICHT ERFOLGREICH!!!!
set fehler8=FEHLER!!! Einige Dateien konnten nicht kopiert werden, bitte Logfile anschauen.
set fehler4=Fehler!!! Beim kopieren wurden gefunden, bitte Logfile anschauen.
set fehler2=Sicherung erfolgreich abgeschlossen, Dateien wurden erfolgreich kopiert, im Zielverzeichnis wurden Dateien gelöscht.
set fehler1=Sicherung erfolgreich abgeschlossen, Dateien wurden erfolgreich kopiert.
set fehler0=Sicherung erfolgreich abgeschlossen, keine geänderte Dateien vorhanden.

:: Logdatei mit Tagesdatum
set tmpbat="%temp%\~tmpbat.bat"  
    showdate /f:"yyyymmdd" /p:"set datum="> %tmpbat%  
    call %tmpbat%
    del %tmpbat%
set logfile=%workpath%\logfiles\%datum%-logfile.txt

:: Programmbegin
:ANFANG
echo.
echo Script zur Sicherung von Dateien
echo.
echo.
echo Wählen sie die Sicherungsmethode aus:
echo sichern                         [s]
echo sichern und PC herunterfahren   [h]
echo beenden                         [q]
echo.
set /p methode="Bitte Auswahl treffen:  "  
echo.
:: Daten sichern
if %methode%== s goto Weiter
:: Daten sichern und PC herunterfahren
if %methode%== h goto Weiter
:: Batch beenden
if %methode%== q goto ENDE
goto WIEDERHOLUNG

:Weiter
:: Test ob externes Laufwerk auch unter angegebenem Laufwerksbuchstaben verfügbar ist.
if not exist %ziellaufwerk% echo Externe Platte (%ziellaufwerk%\) angeschaltet??? & goto LW-aendern
goto Lesen

:LW-aendern
:: Wenn Ziellaufwerk nicht vorhanden anschalten oder neuen Laufwerksbuchstaben angeben.
echo.
set /p aktuellesLW="Bitte aktuellen LW-Buchstaben der externen Platte angeben [q fuer beeenden]:  "  
if %aktuellesLW%== q goto ENDE
:: tool Remount.exe von Uwe Sieber zum ändern des Laufwerkbuchstabens
if exist %aktuellesLW% remount.exe %aktuellesLW% %ziellaufwerk% & goto Aufgabe
:: Schleife bis das Laufwerk gefunden wird.
goto LW-aendern


:Lesen
:: Einlesen der Variabelen aus einer Textdatei

:: Protokollierung des Sicherungsbegins
showdate /f:"dd.mm.yyyy hh:mm:ss" /s:" - Sicherung gestartet"  >> logfiles/sicherung.txt  
showdate /f:"dd.mm.yyyy hh:mm:ss" /s:" - Sicherung gestartet"  > sicherung.txt  

:: hier: For-Schleife um von Datensatz zu Datensatz zu springen
FOR /F "skip=2 tokens=1 delims=" %%i in ('find /N "Daten:" %file%') do (  
call:einlesen %%i
)
:: Sprung zum Ende der Sicherung
goto :EndeSicherung

:einlesen
:: Einlesen der Variablen für einen Datensatz
set "daten="  
set "quelle="  
set "ziel="  
set /a offset=%1-1
FOR /F "tokens=1* delims=:" %%a in ('more +%offset% %file%') do if not defined daten set daten=%%b  
set /a offset=%offset%+1
FOR /F "tokens=1* delims=:" %%a in ('more +%offset% %file%') do if not defined quelle set quelle=%%b  
set /a offset=%offset%+1
FOR /F "tokens=1* delims=:" %%a in ('more +%offset% %file%') do if not defined ziel set ziel=%ziellaufwerk%%%b  
:: Sicherung eines Verzechnisses des eingelesenen Datensatzes 
if not exist %quelle% set ausgabe=Sicherung %daten% fehlgeschlagen, Quellpfad nicht vorhanden. & goto ausgabe
robocopy.exe /ZB /MIR /NDL /NP /LOG+:"%logfile%" /TEE "%quelle%" "%ziel%"   
:: Auswertung der Fehlermeldung von Robocopy
call:fehlermeldung
call:ausgabe
goto:eof

:fehlermeldung
if errorlevel 16 set ausgabe=%fehler16% & goto:eof
if errorlevel 8  set ausgabe=%fehler8% & goto:eof
if errorlevel 4  set ausgabe=%fehler4% & goto:eof
if errorlevel 2  set ausgabe=%fehler2% & goto:eof
if errorlevel 1  set ausgabe=%fehler1% & goto:eof
if errorlevel 0  set ausgabe=%fehler0% & goto:eof
set ausgabe="Robocopyfehlermeldung nicht auswertbar!!!"  
goto:eof

:ausgabe
:: Ausgabe der Errorlevel der Sicherung
echo. >>sicherung.txt
echo Sicherung %daten%:>>sicherung.txt 
echo           -%ausgabe%>>sicherung.txt
echo.  >>sicherung.txt
goto:eof


:EndeSicherung
:: Ende des Sicherungsvorgangs
showdate /f:"dd.mm.yyyy hh:mm:ss" /s:" + Sicherung beendet"  >> Logfiles/sicherung.txt  
showdate /f:"dd.mm.yyyy hh:mm:ss" /s:" + Sicherung beendet"  >> sicherung.txt  
:: abschließende Ausgabe nach sicherung.txt
echo. >> sicherung.txt
echo Der Logfile befindet sich unter: %logfile% >> sicherung.txt
echo. >> sicherung.txt
:: Ausgabe der Ergebnisse der Sicherung auf dem Bildschirm
rem type sicherung.txt
:: nochmaliges Prüfen der Sicherungsmethode
:: falls nur Sicherung zeigen der Ergebnissfiles in Texteditor
if %methode%== s START %windir%\notepad.exe sicherung.txt & goto ENDE
:: falls Sicherung mit Herunterfahren - Herunterfahren einleiten
if %methode%== h goto Ausschalten


:WIEDERHOLUNG
echo.
echo Die getroffene Auswahl ist falsch!!!
echo Bitte wiederholen Sie ihre Auswahl!!
goto ANFANG 

:Ausschalten
type "%logfile%" >>sicherung.txt  
:: sendmail script aus ct' 18/06 S. 200  bzw. Quelle: http://www.paulsadowski.com/WSH/cdo.htm  
cscript.exe sendMail.vbs "--SICHERUNG auf Externe Platte wurde ausgefuehrt--" sicherung.txt  
:: kurze Pause um Skript noch abbrechen zu können und damit Mailversand  fertig ist.
WAIT 10
:: nochmalige Kontrolle der Methode um ungewolltes herunterfahren zu verhindern
if not %methode%== h goto ENDE
:: psshutdown. exe von sysinternal
psshutdown.exe -k -t 00

:ENDE
exit