Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

For Schleife - Robocopy gibt trotz Setlocal EnableDelayedExpansion nur Errorlevel 0 zurück

Frage Entwicklung Batch & Shell

Mitglied: michelo82

michelo82 (Level 1) - Jetzt verbinden

25.06.2014, aktualisiert 10:09 Uhr, 1069 Aufrufe, 5 Kommentare

Hallo,

und zwar bastel ich an einem Sicherungsskript welches mit Robocopy die Daten kopiert, die Zeit dieses Vorganges misst, das ganze in eine HTML Datei speichert und mir per Mail sendet. Hier würde ich gern das Errorlevel von Robocopy ausgeben. Leider bekomme ich nur Errorlevel 0 zurück. Ich habe wohl einen Fehler in meiner Syntax.

Hier einmal das ganze Skript (etwas eingekürzt):
01.
::-------------------------------------------------------- 
02.
::-- Taegliche_Sicherung 
03.
::-- Letzte Änderung: 20.06.2014 
04.
::-- Author: michelo82 
05.
::-------------------------------------------------------- 
06.
@echo off 
07.
::-------------------------------------------------------- 
08.
::-- Variablen 
09.
::-- Pfad zur HTML Datei 
10.
set html="D:\robocopy_log.html" 
11.
 
12.
::-- prüfe ob HTML Datei vorhanden, wenn ja diese löschen 
13.
if exist %html% del %html% /q 
14.
 
15.
::-- Robocopy starten 
16.
echo Robocopy arbeitet 
17.
call::RoboCopyFunktion "robocopy "e:\test1" "d:\test1" /MIR /TEE" 
18.
::call::RoboCopyFunktion "u.s.w"  
19.
 
20.
::-- schicke Bestätigungsmail 
21.
call:SendMailFunkion 
22.
 
23.
::-------------------------------------------------------- 
24.
::-- Funktions sektion beginnt hier 
25.
::-------------------------------------------------------- 
26.
 
27.
:RoboCopyFunktion 
28.
::-- starte Timer - dauer der Batch ermitteln 
29.
set /a timerstart=((1%time:~0,2%-100)*60*60)+((1%time:~3,2%-100)*60)+(1%time:~6,2%-100) 
30.
 
31.
::-- Robocopy starten und Zeit aus Robocopy Ausgabe ermitteln 
32.
for /f "tokens=*" %%g in ('%~1^|findstr "Quelle"') do set Quelle=%%g 
33.
for /f "tokens=*" %%g in ('%~1^|findstr "Gestartet"') do set Gestartet=%%g 
34.
for /f "tokens=*" %%g in ('%~1^|findstr "Beendet"') do set Beendet=%%g 
35.
call:ErrorLevelFunktion 
36.
 
37.
::-- beende Timer - dauer der Batch ermitteln 
38.
set /a timerstop=((1%time:~0,2%-100)*60*60)+((1%time:~3,2%-100)*60)+(1%time:~6,2%-100) 
39.
set /a timeseks=(%timerstop%-%timerstart%) 
40.
set /a timemins=(%timerstop%-%timerstart%)/60 
41.
echo Dauer Sicherung %Quelle%: %timemins% min. %timeseks% sek. 
42.
 
43.
::-- baue Ausgabe für Bestätigungsmail und hänge diese in eine HTML-Datei an 
44.
echo ^<html^>^<body^>^<h3^>%Quelle%^</h3^>^<table border="1"^>^<tr^>^<td^>^<b^>Errorlevel^</b^>^</td^>^<td^>%bodytext%^</td^>^</tr^>^<tr^>^<td^>^<b^>Gestartet^</b^>^</td^>^<td^>%Gestartet%^</td^>^</tr^>^<tr^>^<td^>^<b^>Beendet^</b^>^</td^>^<td^>%Beendet%^</td^>^</tr^>^<tr^>^<td^>^<b^>Dauer des Vorgangs^</b^>^</td^>^<td^>%timemins% min. %timeseks% sek.^</td^>^</tr^>^</table^>^</body^>^</html^> >> %html% 
45.
goto:eof 
46.
 
47.
::-- Errorlevel bestimmen 
48.
:ErrorLevelFunktion 
49.
if /i %ErrorLevel%==0 ( 
50.
set bodytext=Es wurden keine Dateien kopiert. Keine Fehler. Keine Dateien stimmen nicht ueberein. Die Dateien sind bereits im Zielverzeichnis vorhanden; aus diesem Grund wurde beim Kopieren uebersprungen. 
51.
52.
if /i %ErrorLevel%==1 ( 
53.
set bodytext=Alle Dateien wurden erfolgreich kopiert. 
54.
55.
if /i %ErrorLevel%==2 ( 
56.
set bodytext=Es gibt einige zusaetzlichen Dateien im Zielverzeichnis, die nicht im Quellverzeichnis vorhanden sind. Es wurden keine Dateien kopiert. 
57.
58.
if /i %ErrorLevel%==3 ( 
59.
set bodytext=Einige Dateien wurden kopiert. Zusaetzliche Dateien waren vorhanden. Keine Fehler. 
60.
61.
if /i %ErrorLevel%==5 ( 
62.
set bodytext=Einige Dateien wurden kopiert. Einige Dateien stimmten nicht ueberein. Keine Fehler. 
63.
64.
if /i %ErrorLevel%==6 ( 
65.
set bodytext=Zusaetzliche Dateien und nicht uebereinstimmenden Dateien vorhanden sind. Es wurden keine Dateien kopiert, und es sind keine Fehler aufgetreten. Dies bedeutet, dass die Dateien im Zielverzeichnis bereits vorhanden sind. 
66.
67.
if /i %ErrorLevel%==7 ( 
68.
set bodytext=Dateien kopiert wurden, ein Dateikonflikt vorhanden war, und zusaetzliche Dateien vorhanden waren. 
69.
70.
if /i %ErrorLevel%==8 ( 
71.
set bodytext=Mehrere Dateien wurden nicht kopiert. 
72.
73.
if %ErrorLevel% GTR 8 ( 
74.
set bodytext=groesser als 8 - unbedingt manuell pruefen. 
75.
76.
goto:eof 
77.
 
78.
::-- Bestätigungsmail senden 
79.
:SendMailFunkion 
80.
sendmail.exe to:mailadresse subject:"Sicherung" smtp:mailserver from:mailadresse html bodytext:"Bitte Anhang pruefen..." add:%html% 
81.
goto:eof
So nun hätte ich meine RobocopyFunktion wie folgt umgebaut um das Errorlevel auszugeben:
01.
... 
02.
@echo off & Setlocal EnableDelayedExpansion 
03.
... 
04.
... 
05.
... 
06.
 
07.
:RoboCopyFunktion 
08.
::-- starte Timer - dauer der Batch ermitteln 
09.
set /a timerstart=((1%time:~0,2%-100)*60*60)+((1%time:~3,2%-100)*60)+(1%time:~6,2%-100) 
10.
 
11.
::-- Robocopy starten und Zeit aus Robocopy Ausgabe ermitteln 
12.
for /f "tokens=*" %%g in ('%~1^|findstr "Quelle"') do set Quelle=%%g 
13.
for /f "tokens=*" %%g in ('%~1^|findstr "Gestartet"') do set Gestartet=%%g 
14.
for /f "tokens=*" %%g in ('%~1^|findstr "Beendet"') do set Beendet=%%g do ( 
15.
set Beendet=%%g 
16.
echo !ERRORLEVEL! 
17.
)
Leider bekomme ich hier immer 0 als Rückgabewert. Was mache ich falsch?

Hat jemand einen Tipp für mich? Vielen Dank schonmal.
Mitglied: Snowman25
25.06.2014 um 11:52 Uhr
Hallo michelo82,

der Errorlevel ist vom FINDSTR-Command gesetzt.

Gruß,
Snowman25
Bitte warten ..
Mitglied: michelo82
25.06.2014 um 14:22 Uhr
Danke für deine Antwort.
Wie komme ich dann an das Robocopy errorlevel? Das Findstr brauche ich für meine Ausgabe.
Bitte warten ..
Mitglied: Snowman25
25.06.2014, aktualisiert um 17:08 Uhr
Warum machst du's nicht auf dem "normalen" Weg, dass du das LOG von robocopy speicherst und verarbeitest?
Wenn du es mit START /WAIT ausführst kannst du sichergehen, dass der Vorgang abgeschlossen ist, bevor weitere Aktionen durchlaufen.
Denn DAS: for /f "tokens=*" %%g in ('%~1^|findstr "Quelle"') do set Quelle=%%g ist schon eine SEHR Eigensinnige Variante.

Du startest dabei übrigens 3 mal den gleichen Vorgang. Wieso?
Schick dir doch einfach das Robocopy-Log anstelle der HTML-Bastelei?
Bitte warten ..
Mitglied: Friemler
25.06.2014 um 20:31 Uhr
Hallo michelo82,

so weit ich weiß, liefert Robocopy nur in der alten Version XP010 einen aussagekräftigen Errorlevel zurück. Die neueren Versionen (XP026 und die in den Betriebssystemen ab Vista enthaltenen) liefern immer 0 als Errorlevel.

Du kannst das ja sehr einfach testen, indem Du einen RoboCopy-Befehl absetzt, der auf jeden Fall fehl schlagen muss (z.B. nicht existierender Quell- oder Zielpfad).

Gruß
Friemler
Bitte warten ..
Mitglied: michelo82
26.06.2014 um 11:16 Uhr
Hallo,

@Friemler: Robocopy liefert schon errorlevel zurück. Das passt schon...
@Snowman25: Ich denke du hast recht, ich muss das nochmal anpassen und mir meine Ausgabe aus den Logs basteln.

Ich wollte eben mit dieser Methode eine ganz schlanke Ausgabe erreichen. Quasi Tabellarisch Servername, Gestartet, Beendet und die Gesamtdauer in Minuten.
Bitte warten ..
Ähnliche Inhalte
Neue Wissensbeiträge
Google Android

Cyanogenmod alternative Downloadquelle

(2)

Tipp von Lochkartenstanzer zum Thema Google Android ...

Batch & Shell

Batch als Dienst bei Systemstart ohne Anmeldung ausführen

(5)

Tipp von tralveller zum Thema Batch & Shell ...

Sicherheits-Tools

Sicherheitstest von Passwörtern für ganze DB-Tabellen

(1)

Tipp von gdconsult zum Thema Sicherheits-Tools ...

Heiß diskutierte Inhalte
Windows 7
gelöst Lokales Adminprofil defekt (25)

Frage von Yannosch zum Thema Windows 7 ...

Server
gelöst Wie erkennen, dass nur deutsche IPs Zugang zu einer Website haben? (22)

Frage von Coreknabe zum Thema Server ...

LAN, WAN, Wireless
gelöst Statische Routen mit ISC-DHCP Server für Android Devices (22)

Frage von terminator zum Thema LAN, WAN, Wireless ...

Exchange Server
gelöst Migration Exchange 2007 zu 2013 - Public Folder teilweise weg (16)

Frage von Andy1987 zum Thema Exchange Server ...