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, 1035 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 ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
DNS
Nslookup gibt falschen DNS Namen zurück (3)

Frage von ultrapottoti zum Thema DNS ...

Batch & Shell
gelöst Seltsames Verhalten bei Errorlevel abfrage in FOR DO Schleife (1)

Frage von Kalma73 zum Thema Batch & Shell ...

Windows Server
Dynamics CRM 2016-APP gibt HTTP Error zurück

Frage von Lagoles zum Thema Windows Server ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...