Top-Themen

Aktuelle Themen (A bis Z)

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
GELÖST

CMD robocopy in for Schleife. Errorlevel ist leider immer 0 bei Fehler und bei Erfolg von robocopy

Frage Entwicklung Batch & Shell

Mitglied: jonny83

jonny83 (Level 1) - Jetzt verbinden

25.08.2010, aktualisiert 15:13 Uhr, 11647 Aufrufe, 10 Kommentare

Robocopy liefert in aller Regel einen Errorlevel Wert zurück. Durch die FOR Schleife erhalte ich aber immer "errorlevel = 0"

Hallo zusammen,

Robocopy ist für mich ein bekanntes Tool welches ich auch häufig einsetze.

Aktuell versuche ich einen Ordner (...Skripte) von mehreren Servern zu kopieren.

Damit ich jetzt nicht x-mal robocopy server1(2,3,4,...) Quelle Ziel Parameter eingeben muss habe ich eine *.txt Datei in der ich alle Server aufliste.

Das funktioniert alles fehlerfrei!

Einzigstens Problem:

Wenn Robocopy bei einem der Server ein Problem hat (z.B. Zugriff verweigert....Datei nicht gefunden....blaaa) wird der Wert "Errorlevel" in meine CMD Box NICHT mit dem Robocopy errorlog überschrieben sondern bleibt immer ´0´

Sicher hängt das mit meiner FOR xxxxxyyyyyzzzzz Schleife zusammen die ja immer ´0´ zurück liefert. (Die For schleife funktioniert ja auch ... )

Nur wie bekomme ich das gelöst? Wie komm ich an den errorlog Wert von robocopy ran?

Wie kann ich prüfen lassen ob einer der Server, aus der *.txt, mit robocopy einen Fehler meldete?

Wenn ich den realen robocopy Befehl ausführen erhalte ich meinen korrekten robocopy errorlog. Aber ich brauch das ganze ja in der Schleife ... ok los gehts:

Ich hoffe ihr könnt hier helfen.

Vorweg - Ergebnis von der BAT:
BAT ANFANG
C:\>C:\skripte\cmd\Skripte_Backup\Skripte_Backup.cmd
Log File : C:\skripte\logs\Skripte_Backup.log
0
Log File : C:\skripte\logs\Skripte_Backup.log
0
Log File : C:\skripte\logs\Skripte_Backup.log
0
Log File : C:\skripte\logs\Skripte_Backup.log
0
Log File : C:\skripte\logs\Skripte_Backup.log
0
Log File : C:\skripte\logs\Skripte_Backup.log
0
Log File : C:\skripte\logs\Skripte_Backup.log
0
Log File : C:\skripte\logs\Skripte_Backup.log
0
Log File : C:\skripte\logs\Skripte_Backup.log
0
Log File : C:\skripte\logs\Skripte_Backup.log
0
Log File : C:\skripte\logs\Skripte_Backup.log
0
C:\>
BAT ENDE
/

Skript Anfang
@echo off
echo.

:: Skript für die Sicherung der Skripte auf den Batchservern
:: von C:\skripte nach \\server1\Batchserver_skripte$

:: Variablen setzen
set "MailEXE=C:\skripte\bin\Maildienst\bmail.exe"
set "ABS=Batchserver@domain.dom"
set "Mailtxt=C:\skripte\cmd\server1_software_backup\EMail.txt"
set "temptxt=C:\skripte\temp\tempskripte.txt"
set "Quelle=\\%%i\skripte$\"
set "Ziel=\\server1\Batchserver_skripte$\%%i\"
set "Mailsrv=exchange.domain.dom"
set "RCPT=pruef1@domain.dom"
set "Subj=Backup von Skripte$ auf %%i hat einen Fehler gemeldet!"
set "Liste=C:\skripte\bin\Batchserverliste\alle_Batchserver.txt"
set "LOG=C:\skripte\logs\Skripte_Backup.log"

:: Löschen der alten LOGs
del /q "%LOG%"
del /q "%temptxt%"

:: Sicherung von Software$
for /f "usebackq delims=" %%i in ("%Liste%") do robocopy %Quelle% %Ziel% *.* /COPY:D /MIR /W:0 /R:0 /LOG+:%LOG% & echo %errorlevel%

:: Auswertung der Rückmeldung von Robocopy
if not errorlevel 0 echo FEHLER aufgetreten >> %LOG% & goto MAILVERSAND
:: for /f "usebackq delims=" %%i in ("%Liste%") do if not %Fehler%=0
:: echo Der Wert des Errorlevels ist %errorlevel% >> %LOG%
:: if errorlevel 16 echo *FATAL ERROR* >> %LOG% & goto MAILVERSAND
:: if errorlevel 15 echo FAIL MISM XTRA COPY >> %LOG% & goto MAILVERSAND
:: if errorlevel 14 echo FAIL MISM XTRA >> %LOG% & goto MAILVERSAND
:: if errorlevel 13 echo FAIL MISM COPY >> %LOG% & goto MAILVERSAND
:: if errorlevel 12 echo FAIL MISM >> %LOG% & goto MAILVERSAND
:: if errorlevel 11 echo FAIL XTRA COPY >> %LOG% & goto MAILVERSAND
:: if errorlevel 10 echo FAIL XTRA >> %LOG% & goto MAILVERSAND
:: if errorlevel 9 echo FAIL COPY >> %LOG% & goto MAILVERSAND
:: if errorlevel 8 echo FAIL >> %LOG% & goto MAILVERSAND
goto END

:: Bei einem Fehler wird die E-Mail versendet!
:MAILVERSAND
type %Mailtxt% >> %temptxt%
type %LOG% >> %temptxt%
%MailEXE% -s %Mailsrv% -t %RCPT% -f %ABS% -h -a "%Subj%" -m %temptxt% -c
del %temptxt%

:END

Skript Ende
Mitglied: Karo
25.08.2010 um 15:34 Uhr
Hoi,

vielleicht solltest Du echo %errorlevel% in der Schleife in eine Datei schreiben und diese dann nach Errorlevel-Werten abarbeiten.
So wie bisher wird Dein Echo %errorlevel% ausgewertet und das ist ja eigentlich immer erfolgreich.

Karo
Bitte warten ..
Mitglied: jonny83
25.08.2010 um 15:39 Uhr
Hi,

betrachten wir diese Zeilen:

for /f "usebackq delims=" %%i in ("%Liste%") do robocopy %Quelle% %Ziel% *.* /COPY:D /MIR /W:0 /R:0 /LOG+:%LOG% & echo %errorlevel%

hier bearbeite ich den Errorlog doch in der Schleife ... oder nicht?

OK - die Umleitung in eine Datei fehlt - aber spielt ja keine Rolle wenn er eh nur ´0´ rein schreibt ...

Wie würdest du das schreiben?
Bitte warten ..
Mitglied: jonny83
25.08.2010 um 15:52 Uhr
es muss ja auch nicht der Errorlevel sein ... ich will letztlich nur irgendwie prüfen können WANN und vor allem OB ein Fehler aufgetreten ist.

Auch habe ich schon überlegt die %LOG% nach "ERROR" zu durchsuchen. Da finde ich auch "ERROR 5" <-- aber das ist mein Fallbeispiel! Ich habe in dem Ziel bei einem Ordner die Schreibrechte für den Bat-User weg genommen. Also ist ERROR 5 der Fatal Error und nicht grad ein gutes Beispiel. Aber ich habe einen Fehler den ich erzwinge um eben zu prüfen was der errorlog macht.

Ach ja - die %LOG% kann ich nicht nach ERROR 5 durchsuchen weil ich auch Dateien habe die so heissen könnten .... ich brauch nen stabilen / zuverlässigen Rückgabewert - und da ist ERROR 5 irgendwo in der %LOG% nicht gut ^^

SOS .... *heul* - so ein dummes Problem echt ....
Bitte warten ..
Mitglied: Karo
25.08.2010 um 15:58 Uhr
nun, es gibt da sicher verschiedene Ansätze.
Ersteinmal fährst Du in Deinem Beispiel eine Schleife und gibst jedesmal in der Console den Errorlevel aus. Das bis zum Ende der Textdatei. Erst nach dem letzten wertest Du Errorlevel aus! Und das wiederum vom letzten Befehl und der ist Echo %Errorlevel%. Der ist natürlich erfolgreich, sodass Du 0 bekommst.
Was Du aber machen willst ist, für jeden Robocopy Job ein Errorlevel auszugeben und wenn einer davon falsch ist, dann Meldung.
Ich würde es vielleicht so machen, das das ... & echo %Errolevel% geändert wird in z.B. Echo <SERVERNAME AUS LISTE> %ERRORLEVEL% >>ERRORSVC.LOG zu ändern.
Wenn alle Jobs durch sind das ERRORSVC.LOG auswerten und für jeden <SERVERNAME AUS LISTE> größer als 0 eine Mail zu schicken. So hätte man gleich einen Ansatz wo was geklemmt hat.

Karo
Bitte warten ..
Mitglied: jonny83
25.08.2010 um 16:20 Uhr
Hi,

also gut - ich habe das nochmal getestet:

for /f "usebackq delims=" %%i in ("%Liste%") do robocopy %Quelle% %Ziel% *.* /COPY:D /MIR /W:0 /R:0 /LOG+:%LOG% & echo "HALLO" %%i %ERRORLEVEL% >> %LOG%

ich packe hinten dran - also nach dem do .... robocopy .... blaaaa .... ein & echo "HALLO" %%i %ERRORLEVEL% >> %LOG%

jetzt durchsuche ich das %LOG% nach "HALLO" und finde auch jeden Server aber mit dem Errorlevel ´0´

also es klappt nach wie vor leider nicht ...

vielleicht kannst du mal hier editieren - also mal direkt mit code antworten:


for /f "usebackq delims=" %%i in ("%Liste%") do robocopy %Quelle% %Ziel% *.* /COPY:D /MIR /W:0 /R:0 /LOG+:%LOG% & echo %errorlevel%
Bitte warten ..
Mitglied: jonny83
25.08.2010 um 16:31 Uhr
nochmal - habs jetzt so gemacht aber klappt nicht:

.....

set "LOG2=C:\skripte\logs\Skripte_Backup2.log"

.....

for /f "usebackq delims=" %%i in ("%Liste%") do robocopy %Quelle% %Ziel% *.* /COPY:D /MIR /W:0 /R:0 /LOG+:%LOG% & Echo %%i %ERRORLEVEL% >> %LOG2%

.....

Server1 0
Server2 0
Server3 0
Server4 0
Server5 0
Server6 0
Server7 0
Server8 0
Server9 0
Server10 0
Bitte warten ..
Mitglied: Karo
25.08.2010 um 16:35 Uhr
kleine doofe Fräge: Wenn jetzt aber kein Fehler bei Deinen Jobs auftritt, dann sollte doch wohl 0 kommen, oder? Ich wäre damit zufrieden.

Karo
Bitte warten ..
Mitglied: jonny83
25.08.2010 um 16:43 Uhr
ich wäre dann auch zufrieden

aber ich habe ja extra einen Zielordner so verändert das der Benutzer, welcher die CMD ausführt, keine Schreibrechte hat.

Im "LOG" sehe ich ja auch das robocopy "Zugriff verweigert" schreibt.

Also, vertrau mir, das environment ist korrekt konfiguriert.

wenn ich den Befehl direkt in der CMD (als der explizite Benutzer) ausführe erhalte ich auch meinen robocopy errorlog Wert ´8´ ! 8 steht hier dafür, dass robocopy "Zugriff verweigert" bekommen hat ...

so - nun zurück.

ich glaube ja, so als Bäckerfachangestellter , das die For-Schleife immer der letzte ist der den errorlog wertet. Die For-Schleife funktioniert ja auch prächtig ^^

Deine Idee fand ich schon sehr gut - bring die Errorlog IN DIE Schleife rein - so dass wir es auch IN DER Schleife in einer TXT schreiben - dann kann die For-Schleife ja gern das errorlog überschreiben - wir hätten es ja dann schon weggeschrieben .... leider bleibt das Theorie weil ich es nicht schaffe überhaupt den echten Errorlog von robocopy zu sehen .... egal - nein völlig egal wo ich "(&) echo "errorlog"" hin schreibe ....

nochmal : S-O-S
Bitte warten ..
Mitglied: Biber
25.08.2010 um 17:08 Uhr
Moin jonny83,

für den CMD-Interpreter, also die CMD.exe, die deinen Batch durchnudelt, ist doch aber dieses hier:

.... 
for /f "usebackq delims=" %%i in ("%Liste%") do robocopy [...blah ..]..&  Echo %%i %ERRORLEVEL% >> %LOG2% 
...
...genau eine Befehlszeile.
Und in einer Befehlszeile werde alle Variablen genau einmal aufgelöst, ungefähr dann, wenn der Buchstabe "f" der "for /f"-Anweisung gelesen wird.

Zu diesem Zeitpunkt wird %LOG% zu "C:\skripte\logs\Skripte_Backup.log" aufgelöst und eben auch %errorlevel% zu dem, was es vor dem ersten "f" der Zeile hat... zu 0, falls vorher kein Fehler war.

Wenn du eine Variable quasi erst dann auflösen willst, wenn die Ausführung unmittelbar beim ersten "%"-Zeichen von %errorlevel% angelangt ist, dann musst du die "verzögerte Variablenaulösung", neudeutsch "delayed expansion" verwenden und das deiner CMD-Interprerin sagen.

Dazu 2 Schritte:
a) am Anfang des Batches statt "Setlocal" ein "Setlocal EnableDelayedExpansion" (denn die CMD.exe spricht neudeutsch)
b) diejenigen Variablen, die du "unmittelbar vorm Verwenden" versätet auflösen willst, e.g. %errorlevel%,, statt mit Prozentzeichen mit Ausrufungszeichen einrahmen.

Sinngemäß:
.... 
Setlocal EnableDelayedExpansion 
.. 
.... 
 
for /f "usebackq delims=" %%i in ("%Liste%") do robocopy [...blah ..]..&  Echo %%i !ERRORLEVEL! >> %LOG2% 
...
Beispiele soltest du auch ohne Mühe einige hier im Forum mit die Suchfunktion finden.

Grüße
Biber
Bitte warten ..
Mitglied: jonny83
26.08.2010 um 08:51 Uhr
Hallo Biber,

du bist unglaublich genial!

Ich danke dir - natürlich funktioniert das jetzt alles wunderbar.

Bzgl. der Suche - ich habe gesucht aber ich wusste nicht explizit nach was ich eigentlich suchen soll .... wegen dem EnableDelayedExpansion hätte ich nie was suchen können - ich kenn mich da nicht so aus - aber DU bist mir ein großer Lehrer in dem Punkt! Auch die For-Schleife habe ich ja von dir!

Also - vielen vielen Dank!!!!
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
For Schleife - Robocopy gibt trotz Setlocal EnableDelayedExpansion nur Errorlevel 0 zurück
Frage von michelo82Batch & Shell5 Kommentare

Hallo, und zwar bastel ich an einem Sicherungsskript welches mit Robocopy die Daten kopiert, die Zeit dieses Vorganges misst, ...

Windows Server
For Schleife mit Errorlevel
Frage von berlingerWindows Server5 Kommentare

Hallo Zusammen ich versuche aus einer Text-Datei die IP-Adresse auszulesen und anschliessend via PSEXEC auf dem Zielrechner einen Registry-Key ...

Batch & Shell
Abfrage ERRORLEVEL springt aus der FOR Schleife
gelöst Frage von GalindieselBatch & Shell8 Kommentare

Liebe Gemeinde, ich habe eine kleine batch geschrieben, die aus einer liste (IPs) heraus Laufwerke mappen soll, darauf dann ...

Batch & Shell
ERRORLEVEL-Übergabe in einer FOR-Schleife mit psexec
gelöst Frage von zeusplanetBatch & Shell2 Kommentare

Hi Leute, komme einfach nicht weiter, bzw. auf keine einfache Lösung. Ich sichere mehrere Server über eine Batch (Drive ...

Neue Wissensbeiträge
Viren und Trojaner

Deaktivierter Keylogger in HP Notebooks entdeckt

Information von bitcoin vor 14 StundenViren und Trojaner1 Kommentar

Ein Grund mehr warum man Vorinstallationen der Hersteller immer blank bügeln sollte Der deaktivierte Keylogger findet sich im vorinstallierten ...

Router & Routing

Lets Encrypt kommt auf die FritzBox

Information von bitcoin vor 17 StundenRouter & Routing

In der neuesten Labor-Version der FB7490 integriert AVM unter anderem einen Let's Encrypt Client für Zugriffe auf das Webinterface ...

Internet

Was nützt HTTPS, wenn es auch von Phishing Web-Seiten genutzt wird

Information von Penny.Cilin vor 3 TagenInternet17 Kommentare

HTTPS richtig einschätzen Ob man eine Webseite via HTTPS aufruft, zeigt ein Schloss neben der Adresse im Webbrowser an. ...

Webbrowser

Bugfix für Firefox Quantum released - Installation erfolgt teilweise nicht automatisch!

Erfahrungsbericht von Volchy vor 4 TagenWebbrowser8 Kommentare

Hallo zusammen, gem. dem Artike von heise online wurde mit VersionFirefox 57.0.1 sicherheitsrelevante Bugs behoben. Entgegen der aktuellen Veröffentlichung ...

Heiß diskutierte Inhalte
Batch & Shell
Trusted Sites für alle User auf dem PC einpflegen
Frage von xXTaKuZaXxBatch & Shell12 Kommentare

Aufgabestellung: Es sollen auf 1 PC (bzw. mehreren PCs) vertrauenswürdige Sites per Powershell eingetragen werden, die für alle User ...

Voice over IP
Telefonstörung - Ortsrufnummern kein Verbindungsaufbau
Frage von Windows10GegnerVoice over IP10 Kommentare

Hallo, sowohl bei uns als auch beim Opa ist es über VoIP nicht möglich Ortsrufnummern anzurufen. Es kommt nach ...

Vmware
DOS 6.22 in VMWare mit CD-ROM
gelöst Frage von hesperVmware10 Kommentare

Hallo zusammen! Ich hab ein saublödes Problem. Es ist eine VMWare mit DOS 6.22 zu erstellen auf dem ein ...

Cloud-Dienste
PIM als SaaS Nutzungsgebühr
Frage von vanTastCloud-Dienste8 Kommentare

Moin, wir haben uns ein PIM (Product Information Management) nach unseren Ansprüchen für viel Geld als SaaS-Lösung bauen lassen. ...