gelöst Errorlevel Syntax? Robocopy Fehlerauswertung geht nicht

Mitglied: Viper-Berlin

Viper-Berlin (Level 1) - Jetzt verbinden

04.12.2013, aktualisiert 06.12.2013, 3620 Aufrufe, 19 Kommentare, 1 Danke

Servus Leute,

wer kann Helfen???

System W2K3 und Win7

1. wie ist die richtige Syntax von ERRORLEVEL ?

z.B.
IF ERRORLEVEL 2 ECHO ##Fehler größer 2## ?

mit Robocopy hab ich Probleme die Fehlerauswertung geht nicht

hier der Soucecode.. die PROCEDURE DIE NICHT geht !!! ich bekomme immer als Ergebnis:NOERR 00 NO CHANGE
und ERRORLEVEL 0 was ist Falsch ???
Mitglied: colinardo
04.12.2013, aktualisiert um 11:36 Uhr
Hallo Viper-Berlin,
du solltest dir das hier mal durchlesen: http://hannes-schurig.de/26/08/2010/batch-if-errorlevel/
Der Vergleich ohne operator wie du ihn machst könnte man quasi so lesen:
WENN ERRORLEVEL >= 0
Geprüft wird also nicht if errorlevel = X sondern if errorlevel >= X!
da bei dir der letzte Vergleich, der mit dem ERRORLEVEL 0 ist, wird die Variable immer mit " ; NOERR 00 NO CHANGE" versehen.

mach den Vergleich mit ERRORLEVEL also besser so:
usw.

Grüße Uwe
Bitte warten ..
Mitglied: Viper-Berlin
04.12.2013, aktualisiert 06.12.2013
Hallo Uwe,
ja danke für die schnelle Antwort
hast recht die Letzte Zeile war natürlich quatsch
aber es geht immer noch nicht ich bekomme auch mit einem direkten ECHO %ERRORLEVEL% immer 0 angezeigt
hier noch mal der Code was ist da blos falsch ????.....
Bitte warten ..
Mitglied: Viper-Berlin
04.12.2013 um 12:32 Uhr
kann das sein das der SET Befehl den ERRORLEVEL STATUS überschreibt also 0 für OK ???
Bitte warten ..
Mitglied: colinardo
04.12.2013, aktualisiert um 12:38 Uhr
mach es so:
Du speicherst nach dem Robocopy-Befehl den ERRORLEVEL-Wert in einer eigenen VARIABLEN und überprüfst dann nur noch diese nacheinander:
Bitte warten ..
Mitglied: Viper-Berlin
04.12.2013, aktualisiert um 13:35 Uhr
So Versuch mach Kluch !!!
hat leider nicht geklappt alles 0 ERRORLEVEL und 0 FEHLERCODE auch bei Dateien die kopiert werden die gar nät da sind
ich weiss das es eine Version von ROBOCOPY gibt die kein ERRORLEVEL zurückgibt die hab ich aber nicht ! ich hab hier die XP10

hier noch mal das ganze geraffel vielleicht findest du den BUG


Bitte warten ..
Mitglied: colinardo
04.12.2013, aktualisiert um 13:31 Uhr
bitte benutze Tags um deinen Code zu posten, sonst gehen hier vielleicht wichtige Sonderzeichen unter !!
mach mal bitte die Umleitung der Ausgaben von Robocopy weg : >NUL
Bitte warten ..
Mitglied: Viper-Berlin
04.12.2013 um 13:35 Uhr
OK gemacht
Bitte warten ..
Mitglied: Viper-Berlin
04.12.2013 um 13:49 Uhr
So jetzt richtig formatiert.....
hat leider nicht geklappt alles 0 ERRORLEVEL und 0 FEHLERCODE auch bei Dateien die kopiert werden die gar nät da sind
ich weiss das es eine Version von ROBOCOPY gibt die kein ERRORLEVEL zurückgibt die hab ich aber nicht ! ich hab hier die XP10

hier noch mal das ganze geraffel vielleicht findest du den BUG


Bitte warten ..
Mitglied: Penny.Cilin
04.12.2013, aktualisiert um 13:51 Uhr
Hallo,

zunächst war Dein erster Ansatz bzgl. der Auswertung schon korrekt. Allerdings sollte der Setbefehl meines Wissens nach so lauten?
Und schau Dir mal folgende Seite an ROBOCOPY Exit Codes

Gruss Penny.
Bitte warten ..
Mitglied: 60110
LÖSUNG 04.12.2013, aktualisiert 05.12.2013
Moin,

Helpfile zu "IF" bezüglich Errorlevel:

ERRORLEVEL Nummer --> Bedingung ist erfüllt, wenn das zuletzt ausgeführte Programm einen Code größer oder gleich der Nummer zurückgibt.

Laut Deinem Script wird in Zeile 17 bzw. 21 der ROBOCOPY-Befehl ausgeführt.
In Zeile 22 folgt ein SET-Befehl.

Die Rückgabewert welchen Befehls wird nun in ERRORLEVEL enthalten sein?

Außerdem willst Du doch mit SET eine Variable füllen, aber welche geht aus Deinem Script nicht hervor (siehe Post von P.C).

Gruß J chem
Bitte warten ..
Mitglied: Viper-Berlin
04.12.2013 um 14:14 Uhr
ja danke !!

also
SET A="test"
bring bei ECHO %A%

Ergebniss "test" also Falsch! mit ""

SET "A=test" ist deshalb gut weil dann der übliche Fehler, es ist noch ein Blank hinten dran
z.B so set A=test . und grade bei Numerischen Variablen gibts da ein Abschuss

SET /A A=11 blanks

gut ist es auch bei dieser Schreibweise

SET "A=test" hier kann man noch ein Befehl hinter schreiben & REM * ALLES OK GUT FÜR ZEILENDOKU *

Gruß jens
Bitte warten ..
Mitglied: colinardo
LÖSUNG 04.12.2013, aktualisiert 05.12.2013
so müsste es laufen:
Stichwort: delayed expansion
Bitte warten ..
Mitglied: Viper-Berlin
04.12.2013 um 14:53 Uhr
Ja danke,
ich versuchs mal.....

ich hätte noch ein paar Fragen dazu hat diese
also was lokale u globale Variablen sind ist klar aber wozu braucht man diesen Befehl
setlocal ENABLEDELAYEDEXPANSION
Hat der auswirkungen auf meine anderen globalen Variablen ???
wie kann man es beenden ?
endlocal ??? in der Procedure ?
Diese Problematik hab ich noch nie begriffen ??
wie kann ich das Script so schreiben das es funktioniert wie in jeder anderen Programmiersprache ?
und ich nicht ständig auf solche Probleme stoße.

Danke Vipy
Bitte warten ..
Mitglied: colinardo
LÖSUNG 04.12.2013, aktualisiert 05.12.2013
Zitat von Viper-Berlin:
ich hätte noch ein paar Fragen dazu hat diese
also was lokale u globale Variablen sind ist klar aber wozu braucht man diesen Befehl
setlocal ENABLEDELAYEDEXPANSION
https://www.administrator.de/wissen/tutorial-zur-for-schleife-155681.htm ...
Hat der auswirkungen auf meine anderen globalen Variablen ???
nur wenn etwas mit zwei Ausrufezeichen umschlossen ist
wie kann man es beenden ?
setlocal DISABLEDELAYEDEXPANSION
wie kann ich das Script so schreiben das es funktioniert wie in jeder anderen Programmiersprache ?
eine andere Programmiersprache bzw. Scriptsprache benutzen anstatt noch immer auf Batch zu setzen....
Bitte warten ..
Mitglied: rubberman
LÖSUNG 04.12.2013, aktualisiert 05.12.2013
Hallo Zusammen.

Der Errorlevelwert von ROBOCOPY ist genau genommen eine Bitmaske, in der einzelne Fehlerflags gesetzt sind. Genau so kann man also auch die einzelnen Flags checken, nämlich mittels bitweisen Operationen. Eine kleine Subroutine genügt, um nicht jeden einzelnen Errorlevelwert gesondert behandeln zu müssen.
Grüße
rubberman
Bitte warten ..
Mitglied: Viper-Berlin
05.12.2013 um 09:59 Uhr
Ja schönen Dank für den Vorschlag Rubberman,

also ich bin leider nicht so fit in CMD ich flück das man auseinander
so das ich es halbwegs verstehe...
vielleicht könntest du die einzelnen Schritte erklären


Danke
Vipy
Bitte warten ..
Mitglied: rubberman
LÖSUNG 05.12.2013, aktualisiert 06.12.2013
Hallo Viper-Berlin.

Ich weiß nicht, ob ich deine Fragen so umfangreich beantworten kann, dass es hier nicht den Rahmen sprengt, du es aber wenigstens verstehst. Ich versuch's trotzdem und beziehe mich mit der Zeilennummerierung auf deinen aufgedröselten Code.

Zeile 4
Das setlocal ist nicht unbedingt notwendig, hat sich aber eingebürgert und bewährt. Viele Scripter rufen ihre Batchdateien aus der Kommandozeile auf um sie zu debuggen. Vorteil ist, dass sich auch bei einem Syntaxfehler das Fenster nicht sofort schließt und man so erkennt, wo der Hase im Pfeffer liegt. Wenn ein Script mehrere Male aus dem gleichen CMD Fenster aufgerufen wird, so bleibt der Wert von Variablen aus dem vorangegangenen Aufruf erhalten. Das führt ggf. zu Nebenwirkungen beim erneuten Aufruf. Das setlocal am Anfang des Codes schafft da Abhilfe. Ein endlocal muss am Ende nicht im Code stehen, da dieses implizit bei Beendigung des Batchcodes für jedes setlocal ausgeführt wird.

Zeile 9
%errorlevel% und descr werden der Prozedur auf diese Weise als Argumente übergeben. Dabei enthält %errorlevel% den Rückgabewert deines ROBOCOPY Aufrufs und descr ist der Variablenname, dem letztlich in der Prozedur die Beschreibung, die sich aus dem Errorlevelwert ergibt, zugewiesen werden soll.

Zeile 15
:robocopycheck ist der Name der Prozedur, also das Einsprunglabel. Labelnamen werden nur bis zum ersten Leerzeichen bewertet (es gibt noch ein paar weitere Abbruchzeichen). Alles was danach kommt ist wie ein Kommentar anzusehen. Ich habe hier robocopy_errorlevel und [description_variable_name] hinter das Label geschrieben, um dir eine Hilfestellung zu geben, welche Argumente an die Prozedur übergeben werden müssen (ohne eckige Klammern) oder dürfen (mit eckigen Klammern).

Zeile 19
Das setlocal EnableDelayedExpansion schaltet die verzögerte Variablenerweiterung ein.
In einer Kommandozeile oder einem in Klammern eingefassten Block von Kommandozeilen (zB. in einer FOR Schleife) werden normale Umgebungsvariablen nur einmal zum Wert aufgelöst, und zwar noch bevor die Zeile/der Block ausgeführt wird. Das EnableDelayedExpansion verzögert diese Auflösung, sodass die Werte zur Laufzeit der Zeile/des Blocks abgreifbar sind. Die umschließenden Prozentzeichen für die Variable sind dabei durch Ausrufezeichen zu ersetzen.
Beispiel zur Verdeutlichung:
Zeile 21
Da der Prozedur Argumente übergeben wurden, lassen sich diese auch abrufen. Das erste Argument wird durch %1 repräsentiert, das zweite durch %2 usw. Die Tilde (~) entfernt eventuell vorhandene umschließende Anführungszeichen. Letztlich erhält die Variable return also den vorher übergebenen Rückgabewert (Errorlevel) deines ROBOCOPY Aufrufes zugewiesen.

Zeile 41 ff
Hier wird's interessant und ich muss etwas weiter ausholen. Wenn ich oben von Bitmaske und bitweisen Operationen gesprochen habe, bedeutet das, dass hier der ROBOCOPY Rückgabewert (repräsentiert durch Variable return) als binäre Zahl betrachtet werden muss. Dieser Rückgabewert ist nämlich aus Zweierpotenzen zusammengesetzt, wobei jede dieser Zweierpotenzen einen booleschen Wert (0 für FALSCH bzw. 1 für WAHR) repräsentiert. Errorlevelwerte können eine Breite von 32 Bit haben, im Fall von ROBOCOPY reicht es aber die 5 niedrigsten Bits zu betrachten. Warum, ergibt sich aus der Tatsache, dass der schwerwiegendste Fehler den Wert 2^4 (16) hat.
Nehmen wir an dass ROBOCOPY den Wert 5 als Errorlevel zurück gegeben hat, dann ergibt sich in binärer Schreibweise der Wert 00101.
Dröseln wir das mal in einer Tabelle auf:
Bit 0 0 1 0 1
Wert 2^4 (16) 2^3 (8) 2^2 (4) 2^1 (2) 2^0 (1)
Bedeutung FATAL
ERROR
FAILS MISMATCHES EXTRA COPY
Ich nehme an, jetzt wird das Prinzip schon mal deutlich. Wie du siehst, sind im Fall von Errorlevel 5 die Flags für MISMATCHES und COPY gesetz.
Stellt sich nur noch die Frage, wie man diese Flags in einem Batchcode vernünftig auswerten kann
Dabei helfen zwei bitweise Operationen:

1. Shift-Right (>>)
Dabei werden die einzelnen Bits eines binären Ausdrucks um die angegebene Anzahl Stellen nach rechts verschoben. Die entsprechenden niedrigsten, rechten Bits werden eliminiert, während links mit Nullen aufgefüllt wird. Bleiben wir beim Beispiel 00101 dann ergäbe >>1 die Zahl 00010, ein >>2 ergäbe 00001 usw.

2. Bitweises UND (&)
Die Regel dabei ist:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
Diese Regel wird für jedes Bit einer binären Zahl ausgeführt. Im Code verwende ich immer das & 1 mit dem immer nur das niedrigste Bit mit 1 verglichen wird.

Die FOR /L Schleife sorgt dafür, dass diese Operationen 5 mal in Folge ausgeführt werden.
Für das Beispiel 00101 sieht das so aus:
Also wird jedes Bit von rechts nach links einzeln betrachtet.
Im Code oben wird einfach je nachdem, ob ein Bit gesetzt ist oder nicht, der entsprechende Text hizugefügt.

Zeile 50 ff
Falls ein zweiter Parameter übergeben wurde, so wird diesem der entsprechende Text zugewiesen (also die Beschreibung für den ROBOCOPY Errorlevelwert).
Das exit /b beendet die Prozedur, wobei ein Wert übergeben werden kann, der im Hauptcode als Errorlevel abrufbar ist.

So, das war viel Text und viel Information. Ich hoffe es trägt auch zum Verständnis bei

Grüße
rubberman
Bitte warten ..
Mitglied: Viper-Berlin
11.12.2013, aktualisiert um 11:59 Uhr
Sorry Rubberman,
das ich erst jetzt Antworten kann....
Danke für die super Erklärung

ich hätte noch ein Farge zur Setlocal

1. also Setlocal macht alle Variablen in Script local was zu folge hat wenn ich einen Aufruf start irgendwas oder c:\anderescmdscript.cmd
mach das keine Variablen übergeben werden, ich kann somit die gleiche Variable mehrfach benutzen richtig.
2. normalerweise atbeitet man mit lokalen Variablen in Proceduren und übergibt diese dann an global Variablen ? wie geht das in CMD
da kommt wieder nur Mist raus ????
3. Also ich würde gerne Proceduren schreiben die was machen mit localen Variable und dann als RETURNWERT übergeben und in ein globale Variable
den oder die Rückgabewerte schreiben geht das ?
4. hat setlocal einfluss auf SETX ????


Danke für die Hilfe
Bitte warten ..
Mitglied: rubberman
11.12.2013, aktualisiert 12.12.2013
Hallo Viper-Berlin.

Zunächst zu deinem Code.
Ändere Zeile 16 entweder zu
oder zu
Auch Änderungen von globalen Variablen überleben das endlocal sonst nicht.
Hintergrund ist, dass die CMD mit setlocal ein eigenes Subenvironment schafft, in das vorher gesetzte Variablen zwar vererbt werden, alle in diesem Subenvironment gesetzten oder veränderten Variablenwerte aber nur dort gültig sind.


1. also Setlocal macht alle Variablen in Script local was zu folge hat wenn ich einen Aufruf start irgendwas oder c:\anderescmdscript.cmd
mach das keine Variablen übergeben werden, ich kann somit die gleiche Variable mehrfach benutzen richtig.
So wie ich dich gerade verstehe, stimmt das nicht. Ein Prozess vererbt sein Environment immer an den aufgerufenen Prozess weiter.

Im Fall von START wird ein neuer Prozess erzeugt. Dem wird das beim Aufruf des Befehls gültige Environment vererbt. Wenn das aus einem mit setlocal erzeugten Subenvironment erfolgt, werden also die dort gültigen Variablen vererbt. Der Kindprozess ändert aber nie das Environment des aufrufenden Elternprozesses.

Wenn ein Batch durch seinen Namen aus der Kommandozeile bzw. per CALL aufgerufen wird, verhält sich das etwas anders. Auch hier gilt das derzeit gültige Environment wieder genauso für den aufgerufenen Batch. Hauptunterschied ist aber, dass kein neuer Pozess erzeugt wird, sondern alles in der gleichen Instanz von cmd.exe läuft. So kommt es, dass nach Beendigung der aufgerufenen Batchdatei, Variablen auch weiterhin in der ursprünglichen Batchdatei gültig sind. Verhindern lässt sich das nur durch das setlocal am Anfang der aufgerufenen Batchdatei.

2. normalerweise atbeitet man mit lokalen Variablen in Proceduren und übergibt diese dann an global Variablen ? wie geht das in CMD
da kommt wieder nur Mist raus ????
Eine Möglichkeit habe ich oben schon gezeigt. Es gibt noch weitere. 2 Beispiele.
... was natürlich nur dann funktioniert, wenn der Rückgabewert numerisch und ganzzahlig ist.

Wenn man mal aus einem Block heraus die Subroutine beenden will, wäre auch so etwas mal von Interesse:
Dein Punkt 3 sollte damit auch bereits beantwortet sein.

4. hat setlocal einfluss auf SETX ????
Nein. SETX ist ein Programm das Umgebungsvariablenwerte in der Registry festlegt und das Explorer-Environment aktualisiert. Das hat überhaupt nichts miteinander zu tun.

Grüße
rubberman
Bitte warten ..
Ähnliche Inhalte
Batch & Shell

Robocopy geht und geht nicht gerade nicht

gelöst Frage von TicTakTeoBatch & Shell9 Kommentare

Ich habe einen minecraft server und der soll mit robocopy kopiert werden. 1. Ich weis leider nicht woran das ...

Batch & Shell

Batch-Syntax

gelöst Frage von gabeBUBatch & Shell1 Kommentar

Hallo Zusammen Ich habe ein ganz kleines, Simples Batch-File geschrieben, dass mir ein Programm installieren soll, wenn es nicht ...

Windows Server

WMI-Filter Syntax

gelöst Frage von DasWombat1993Windows Server10 Kommentare

Hallo Liebe Administratoren, Ich habe ein Problem mit einem WMI-Filter. Der Filter wird auf eine Gruppenrichlinie angewendet welche eine ...

Batch & Shell

Win10 ändert den Errorlevel? ( Batch )

gelöst Frage von clragonBatch & Shell12 Kommentare

Hey Leute, Ich habe heute wieder mit Prozessen herumgebastelt, die sich gegenseitig überwachen. Da plötzlich, habe ich einen Fehler. ...

Datenbanken

SQL Syntax Error beim Escapen

gelöst Frage von ketanest112Datenbanken3 Kommentare

Hallo zusammen, nach nahezu 4 Stunden Eigenrecherche frag ich mal euch, ich komme nicht weiter. Ich möchte mit meinem ...

Windows Server

Robocopy Multithreading

gelöst Frage von emeriksWindows Server22 Kommentare

Hi, mir ist soeben aufgefallen: Windows Server 2008 R2 Ein Ordner eines lokales Laufwerks mit vielen Ordnern (> 4 ...

Heiß diskutierte Inhalte
Notebook & Zubehör
Macbook oder Surface Book 3?
gelöst Frage von FamousDex089Notebook & Zubehör36 Kommentare

Hallo Zusammen :-), ich bin komplett neu in der IT Admin schiene und neu in diesem Forum. Ich habe ...

Switche und Hubs
Kaufberatung (10G) Switche für Unternehmensnetzwerk
Frage von ipzipzapSwitche und Hubs21 Kommentare

Moin, unsere Firma zieht um und am neu renovierten Standort muss/soll alles neu. Auf drei Etagen stehen Racks, in ...

Humor (lol)
So eine Art Jobangebot
Frage von Melvin.van.HorneHumor (lol)20 Kommentare

Moin, ich habe eben eine Zeit damit zugebracht eine GPO für eine Gruppe von Clients zu erstellen. Egal was ...

Windows Server
AD (virtualisiert) und alle angeschlossenen Clients fahren ungeplant herunter
Frage von tobitobsnWindows Server19 Kommentare

Ich habe aktuell ein Problem, dass ein frisch aufgesetzer Hyper-V mit einem virtualisierten AD regelmäßig 1x die Woche herunterfährt ...

Drucker und Scanner
Vorlage Endlospapier Nadeldrucker
Frage von Hanspeter82Drucker und Scanner13 Kommentare

Hallo, hab die Aufagbe bekommen, eine Vorlage zuerstellen bzgl. Druck auf Endlos Papier über einen Nadeldrucker. Habe allerdings kein ...

Windows 10
FritzBox 7590 VPN
Frage von christian295Windows 1013 Kommentare

Hallo Zusammen, wir haben seit einigen Tagen eine neue FritzBox 7590 und wollen mit ShrewSoft 2.2.2 auf Win 10 ...

Berechtigungs- und IdentitätsmanagementBerechtigungs- und IdentitätsmanagementWebdienste und -serverWebdienste und -serverDatenbankenDatenbankenMonitoring & SupportMonitoring & SupportHybrid CloudHybrid CloudSmall Business ITSmall Business IT