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

Errorlevel Syntax? Robocopy Fehlerauswertung geht nicht

Frage Entwicklung Batch & Shell

Mitglied: Viper-Berlin

Viper-Berlin (Level 1) - Jetzt verbinden

04.12.2013, aktualisiert 06.12.2013, 2800 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 ???
01.
REM  *** ROBOCOPY FÜR ALLES +FEHLERAUSWERTUNG INS LOG ************************************************************************************** 
02.
REM  ### Var: %P_Robo_Path_Von%  # VON WO KOPIERT WERDEN SOLL NUR PATH C:\TEST\         ### 
03.
REM  ### Var: %P_Robo_Path_Nach% # WOHIN WIRD KOPIERT WERDEN SOLL NUR PATH C:\TEST\     ### 
04.
REM  ### Var: %P_Robo_FileS%     # ZU KOPIERENDE FILES *.* für alle  z.B datei.txt      ### 
05.
REM  ### Var: %P_Robo_Para%      # PARAMETERÜBERGABE AN ROBOCOPY Z.B /E / PURGE /MIR    ### 
06.
REM  ### Var: %P_Robo_MSG_OK%    # FEHLERMELDUNG  OK-TEXT DER BEI FEHLER VERWENDET WIRD ### 
07.
REM  ### Var: %P_Robo_MSG_ERR%   # FEHLERMELDUNG ERR-TEXT DER BEI FEHLER VERWENDET WIRD ### 
08.
:ProRobocopy4Var 
09.
     REM  --- WRITE LOGFILE IST VORHANDEN ALSO INS LOGFILE SCHREIBEN --- 
10.
     ROBOCOPY %P_Robo_Path_Von% %P_Robo_Path_Nach% %P_Robo_FileS% %P_Robo_Para% /IS /W:2 /R:10 /COPY:DAT /V /TEE   
11.
     IF  ERRORLEVEL 17 SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS: ERR 17 ***ERROR ?? ***" 
12.
     IF  ERRORLEVEL 16 SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS: ERR 16 ***FATAL ERROR***" 
13.
     IF  ERRORLEVEL 15 SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS: ERR 15 FAIL MISM XTRA COPY" 
14.
     IF  ERRORLEVEL 14 SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS: ERR 14 FAIL MISM XTRA" 
15.
     IF  ERRORLEVEL 13 SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS: ERR 13 FAIL MISM COPY" 
16.
     IF  ERRORLEVEL 12 SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS: ERR 12 FAIL MISM" 
17.
     IF  ERRORLEVEL 11 SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS: ERR 11 FAIL XTRA COPY" 
18.
     IF  ERRORLEVEL 10 SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS: ERR 10 FAIL XTRA" 
19.
     IF  ERRORLEVEL  9 SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS: ERR 09 FAIL COPY" 
20.
     IF  ERRORLEVEL  8 SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS: ERR 08 FAIL" 
21.
     IF  ERRORLEVEL  7 SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS: ERR 07 MISM XTRA COPY" 
22.
     IF  ERRORLEVEL  6 SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS: ERR 06 MISM XTRA" 
23.
     IF  ERRORLEVEL  5 SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS: ERR 05 MISM COPY" 
24.
     IF  ERRORLEVEL  4 SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS: ERR 04 MISM" 
25.
     IF  ERRORLEVEL  3 SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS: ERR 03 XTRA COPY" 
26.
     IF  ERRORLEVEL  2 SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS: ERR 02 XTRA" 
27.
     REM ### SONDERFäLLE 0 u 1 SIND KEINE FEHLER ### 
28.
     IF  ERRORLEVEL  1 SET "MsgInfoSwap=%Msg_OK%ROCOPY:STATUS: NOERR 01 COPY" 
29.
     IF  ERRORLEVEL  0 SET "MsgInfoSwap=%Msg_OK%ROCOPY:STATUS: NOERR 00 NO CHANGE" 
30.
      
31.
    ECHO ### %ERRORLEVEL%   der ist immer 0 ?????#### 
32.
     
33.
    REM --- ROBOCOPY STATUS auf Bildschirm --- 
34.
     
35.
    IF  ERRORLEVEL 2 (                
36.
          ECHO ROCOPY: Fehler STATUS: %MsgInfoSwap% beim kopieren %P_Robo_FileS% ERR:%ERRORLEVEL%  !." 
37.
          ) ELSE ( 
38.
                 echo ROCOPY: STATUS: %MsgInfoSwap% FILES: %P_Robo_FileS% wurden kopiert!." 
39.
40.
GOTO :EOF
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:
IF "%ERRORLEVEL%" == "17" SET ....
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 ????.....
01.
:ProRobocopy4Var 
02.
      ROBOCOPY %P_Robo_Path_Von% %P_Robo_Path_Nach% %P_Robo_FileS% %P_Robo_Para% /IS /W:2 /R:10 /COPY:DAT /V /TEE  
03.
     SET "MsgInfoSwap=%Msg_OK%ROCOPY:STATUS:KEIN FEHLER ERKANNT"      & REM STATUSMELDUNG ÜBERSCHREIBEN 
04.
     IF  "%ERRORLEVEL%"=="17" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 17 ***ERROR ?? ***" 
05.
     IF  "%ERRORLEVEL%"=="16" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 16 ***FATAL ERROR***" 
06.
     IF  "%ERRORLEVEL%"=="15" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 15 FAIL MISM XTRA COPY" 
07.
     IF  "%ERRORLEVEL%"=="14" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 14 FAIL MISM XTRA" 
08.
     IF  "%ERRORLEVEL%"=="13" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 13 FAIL MISM COPY" 
09.
     IF  "%ERRORLEVEL%"=="12" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 12 FAIL MISM" 
10.
     IF  "%ERRORLEVEL%"=="11" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 11 FAIL XTRA COPY" 
11.
     IF  "%ERRORLEVEL%"=="10" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 10 FAIL XTRA" 
12.
     IF  "%ERRORLEVEL%"=="9"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 09 FAIL COPY" 
13.
     IF  "%ERRORLEVEL%"=="8"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 08 FAIL" 
14.
     IF  "%ERRORLEVEL%"=="7"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 07 MISM XTRA COPY" 
15.
     IF  "%ERRORLEVEL%"=="6"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 06 MISM XTRA" 
16.
     IF  "%ERRORLEVEL%"=="5"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 05 MISM COPY" 
17.
     IF  "%ERRORLEVEL%"=="4"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 04 MISM" 
18.
     IF  "%ERRORLEVEL%"=="3"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 03 XTRA COPY" 
19.
     IF  "%ERRORLEVEL%"=="2"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 02 XTRA" 
20.
     REM  --- SIND KEIN FEHLER 0 DATEIEN SIND SCHON VORHANDEN 1 KOPIERT --- 
21.
     IF  "%ERRORLEVEL%"=="1"  SET "MsgInfoSwap=%Msg_OK%ROCOPY:STATUS:NOERR 01 COPY" 
22.
     IF  "%ERRORLEVEL%"=="0"  SET "MsgInfoSwap=%Msg_OK%ROCOPY:STATUS:NOERR 00 NO CHANGE" 
23.
     ECHO ################ERRORLEVEL=%ERRORLEVEL%######################### 
24.
     ECHO ################MsgInfoSwap=%MsgInfoSwap%####################### 
25.
 
26.
rem  hier kommt immer errorlevel =0 raus ?????? 
27.
 
28.
     REM --- ROBOCOPY STATUS IN MSG SCHREIBEN WENN ERRORLEVEL >=2 DANN FEHLERMELDUNG ANSONSTEN CHECKEN OB KOPIERT WURDE O    ÜBERSPRUNGEN--- 
29.
     IF  ERRORLEVEL 2 ( 
30.
          SET  "MsgInfoSwap=%Msg_ERR%ROCOPY: Fehler beim kopieren %P_Robo_FileS% ERR:%ERRORLEVEL%  !." 
31.
          ) ELSE ( 
32.
                 IF  "%ERRORLEVEL%" == "1" ( 
33.
                      SET  "MsgInfoSwap=%Msg_OK%ROCOPY: FILES: %P_Robo_FileS% wurden kopiert!." 
34.
35.
                 IF  "%ERRORLEVEL%" == "0" ( 
36.
                     SET  "MsgInfoSwap=%Msg_WAR%ROCOPY: FILES: %P_Robo_FileS% wurden übersprungen!." 
37.
38.
39.
     )
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:
01.
ROBOCOPY %P_Robo_Path_Von% %P_Robo_Path_Nach% %P_Robo_FileS% %P_Robo_Para% /IS /W:2 /R:10 /COPY:DAT /V /TEE  
02.
set FEHLERCODE=%ERRORLEVEL% 
03.
IF "%FEHLERCODE%"=="17" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 17 *ERROR ?? *" 
04.
usw. 
05.
.... 
06.
...
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


01.
  
02.
REM  *** ROBOCOPY FÜR ALLES +FEHLERAUSWERTUNG INS LOG ************************************************************************************** 
03.
REM  ### Var: %P_Robo_Path_Von%      # VON WO KOPIERT WERDEN SOLL NUR PATH C:\TEST\         ### 
04.
REM  ### Var: %P_Robo_Path_Nach%   # WOHIN WIRD KOPIERT WERDEN SOLL NUR PATH C:\TEST\     ### 
05.
REM  ### Var: %P_Robo_FileS%            # ZU KOPIERENDE FILES *.* FÜR ALLE  Z.B DATEI.TXT      ### 
06.
REM  ### Var: %P_Robo_Para%             # PARAMETERÜBERGABE AN ROBOCOPY Z.B /E / PURGE /MIR    ### 
07.
:ProRobocopy4Var 
08.
     SET /A  "Err_Robo=0"                                   & REM *** ERRORVARIABLE VON ROBOCOPY AUF 0 SETZEN          *** 
09.
     SET  "MsgInfoSwap=%Msg_OK%ROCOPY:   WAS:%P_Robo_FileS%" 
10.
     CALL :ProMsgWriteToScrAndLog 
11.
     SET  "MsgInfoSwap=%Msg_OK%ROCOPY:   VON:%P_Robo_Path_Von%" 
12.
     CALL :ProMsgWriteToScrAndLog                           & REM *** CREATE INFO -MSG TO SCR UND LOG-                 *** 
13.
     SET  "MsgInfoSwap=%Msg_OK%ROCOPY:  NACH:%P_Robo_Path_Nach%" 
14.
     CALL :ProMsgWriteToScrAndLog                           & REM *** CREATE INFO -MSG TO SCR UND LOG-                 *** 
15.
     IF  /I  "%LogF_Full_Main_Swap%"=="NUL" ( 
16.
         REM  --- NOT WRITE LOGFILE IST NICHT VORHANDEN ALSO NICHT REIN SCHREIBEN AUSGABE IN NULL UMLEITEN --- 
17.
         ROBOCOPY %P_Robo_Path_Von% %P_Robo_Path_Nach% %P_Robo_FileS% %P_Robo_Para% /IS /W:2 /R:10 /COPY:DAT /V /TEE >NUL 
18.
         SET /A "FEHLERCODE=%ERRORLEVEL%"                      & REM *** FEHLER in VARIABLE SPEICHERN *** 
19.
         ) ELSE ( 
20.
             REM  --- WRITE LOGFILE IST VORHANDEN ALSO INS LOGFILE SCHREIBEN --- 
21.
             ROBOCOPY %P_Robo_Path_Von% %P_Robo_Path_Nach% %P_Robo_FileS% %P_Robo_Para% /IS /W:2 /R:10 /COPY:DAT /V /TEE /LOG+:"%LogF_Full_Main%" >NUL 
22.
             SET /A "FEHLERCODE=%ERRORLEVEL%"                      & REM *** FEHLER in VARIABLE SPEICHERN *** 
23.
24.
     ECHO  ##### vorher FEHLERCODE=%FEHLERCODE% ERRORLEVEL=%ERRORLEVEL% ###### 
25.
     IF  "%FEHLERCODE%" == "17" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 17 ***ERROR ?? ***" 
26.
     IF  "%FEHLERCODE%" == "16" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 16 ***FATAL ERROR***" 
27.
     IF  "%FEHLERCODE%" == "15" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 15 FAIL MISM XTRA COPY" 
28.
     IF  "%FEHLERCODE%" == "14" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 14 FAIL MISM XTRA" 
29.
     IF  "%FEHLERCODE%" == "13" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 13 FAIL MISM COPY" 
30.
     IF  "%FEHLERCODE%" == "12" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 12 FAIL MISM" 
31.
     IF  "%FEHLERCODE%" == "11" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 11 FAIL XTRA COPY" 
32.
     IF  "%FEHLERCODE%" == "10" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 10 FAIL XTRA" 
33.
     IF  "%FEHLERCODE%" == "9"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 09 FAIL COPY" 
34.
     IF  "%FEHLERCODE%" == "8"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 08 FAIL" 
35.
     IF  "%FEHLERCODE%" == "7"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 07 MISM XTRA COPY" 
36.
     IF  "%FEHLERCODE%" == "6"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 06 MISM XTRA" 
37.
     IF  "%FEHLERCODE%" == "5"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 05 MISM COPY" 
38.
     IF  "%FEHLERCODE%" == "4"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 04 MISM" 
39.
     IF  "%FEHLERCODE%" == "3"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 03 XTRA COPY" 
40.
     IF  "%FEHLERCODE%" == "2"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 02 XTRA" 
41.
     REM  --- SIND KEIN FEHLER 0 DATEIEN SIND SCHON VORHANDEN 1 KOPIERT --- 
42.
     IF  "%FEHLERCODE%" == "1"  SET "MsgInfoSwap=%Msg_OK%ROCOPY:STATUS:NOERR 01 COPY" 
43.
     IF  "%FEHLERCODE%" == "0"  SET "MsgInfoSwap=%Msg_OK%ROCOPY:STATUS:NOERR 00 NO CHANGE" 
44.
     ECHO  ##### nachher FEHLERCODE=%FEHLERCODE% ERRORLEVEL=%ERRORLEVEL% ###### 
45.
     CALL :ProMsgWriteToScrAndLog                           & REM *** CREATE INFO -MSG TO SCR UND LOG-                     *** 
46.
     REM --- ROBOCOPY STATUS IN MSG SCHREIBEN WENN ERRORLEVEL >=2 DANN FEHLERMELDUNG ANSONSTEN CHECKEN OB KOPIERT WURDE O ÜBERSPRUNGEN--- 
47.
     IF  "%FEHLERCODE%" GEQ "2" ( 
48.
         SET  /A "Err_Robo=1"                               & REM *** Err_Robo FÜR DIE AUSWERTUNG VON FEHLERN BEI ROBOCOPY *** 
49.
         SET  "MsgInfoSwap=%Msg_ERR%ROCOPY: Fehler beim kopieren %P_Robo_FileS% ERR:%FEHLERCODE%  !." 
50.
         CALL :ProEventLogCreateERR                         & REM *** CREATE EVENT ERROR                                   *** 
51.
         ) ELSE ( 
52.
             IF  "%FEHLERCODE%" == "1" ( 
53.
                   SET  "MsgInfoSwap=%Msg_OK%ROCOPY: FILES: %P_Robo_FileS% wurden kopiert!." 
54.
55.
             IF  "%FEHLERCODE%" == "0" ( 
56.
                  SET  "MsgInfoSwap=%Msg_WAR%ROCOPY: FILES: %P_Robo_FileS% wurden übersprungen!." 
57.
58.
             CALL :ProMsgWriteToScrAndLog                   & REM *** CREATE INFO -MSG TO SCR UND LOG-                    *** 
59.
60.
61.
 
62.
 
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


01.
  
02.
REM  *** ROBOCOPY FÜR ALLES +FEHLERAUSWERTUNG INS LOG ************************************************************************************** 
03.
REM  ### Var: %P_Robo_Path_Von%      # VON WO KOPIERT WERDEN SOLL NUR PATH C:\TEST\         ### 
04.
REM  ### Var: %P_Robo_Path_Nach%   # WOHIN WIRD KOPIERT WERDEN SOLL NUR PATH C:\TEST\     ### 
05.
REM  ### Var: %P_Robo_FileS%            # ZU KOPIERENDE FILES *.* FÜR ALLE  Z.B DATEI.TXT      ### 
06.
REM  ### Var: %P_Robo_Para%             # PARAMETERÜBERGABE AN ROBOCOPY Z.B /E / PURGE /MIR    ### 
07.
:ProRobocopy4Var 
08.
     SET /A  "Err_Robo=0"                                   & REM *** ERRORVARIABLE VON ROBOCOPY AUF 0 SETZEN          *** 
09.
     SET  "MsgInfoSwap=%Msg_OK%ROCOPY:   WAS:%P_Robo_FileS%" 
10.
     CALL :ProMsgWriteToScrAndLog 
11.
     SET  "MsgInfoSwap=%Msg_OK%ROCOPY:   VON:%P_Robo_Path_Von%" 
12.
     CALL :ProMsgWriteToScrAndLog                           & REM *** CREATE INFO -MSG TO SCR UND LOG-                 *** 
13.
     SET  "MsgInfoSwap=%Msg_OK%ROCOPY:  NACH:%P_Robo_Path_Nach%" 
14.
     CALL :ProMsgWriteToScrAndLog                           & REM *** CREATE INFO -MSG TO SCR UND LOG-                 *** 
15.
     IF  /I  "%LogF_Full_Main_Swap%"=="NUL" ( 
16.
         REM  --- NOT WRITE LOGFILE IST NICHT VORHANDEN ALSO NICHT REIN SCHREIBEN AUSGABE IN NULL UMLEITEN --- 
17.
         ROBOCOPY %P_Robo_Path_Von% %P_Robo_Path_Nach% %P_Robo_FileS% %P_Robo_Para% /IS /W:2 /R:10 /COPY:DAT /V /TEE >NUL 
18.
         SET /A "FEHLERCODE=%ERRORLEVEL%"                      & REM *** FEHLER in VARIABLE SPEICHERN *** 
19.
         ) ELSE ( 
20.
             REM  --- WRITE LOGFILE IST VORHANDEN ALSO INS LOGFILE SCHREIBEN --- 
21.
             ROBOCOPY %P_Robo_Path_Von% %P_Robo_Path_Nach% %P_Robo_FileS% %P_Robo_Para% /IS /W:2 /R:10 /COPY:DAT /V /TEE /LOG+:"%LogF_Full_Main%" >NUL 
22.
             SET /A "FEHLERCODE=%ERRORLEVEL%"                      & REM *** FEHLER in VARIABLE SPEICHERN *** 
23.
24.
     ECHO  ##### vorher FEHLERCODE=%FEHLERCODE% ERRORLEVEL=%ERRORLEVEL% ###### 
25.
     IF  "%FEHLERCODE%" == "17" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 17 ***ERROR ?? ***" 
26.
     IF  "%FEHLERCODE%" == "16" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 16 ***FATAL ERROR***" 
27.
     IF  "%FEHLERCODE%" == "15" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 15 FAIL MISM XTRA COPY" 
28.
     IF  "%FEHLERCODE%" == "14" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 14 FAIL MISM XTRA" 
29.
     IF  "%FEHLERCODE%" == "13" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 13 FAIL MISM COPY" 
30.
     IF  "%FEHLERCODE%" == "12" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 12 FAIL MISM" 
31.
     IF  "%FEHLERCODE%" == "11" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 11 FAIL XTRA COPY" 
32.
     IF  "%FEHLERCODE%" == "10" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 10 FAIL XTRA" 
33.
     IF  "%FEHLERCODE%" == "9"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 09 FAIL COPY" 
34.
     IF  "%FEHLERCODE%" == "8"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 08 FAIL" 
35.
     IF  "%FEHLERCODE%" == "7"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 07 MISM XTRA COPY" 
36.
     IF  "%FEHLERCODE%" == "6"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 06 MISM XTRA" 
37.
     IF  "%FEHLERCODE%" == "5"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 05 MISM COPY" 
38.
     IF  "%FEHLERCODE%" == "4"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 04 MISM" 
39.
     IF  "%FEHLERCODE%" == "3"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 03 XTRA COPY" 
40.
     IF  "%FEHLERCODE%" == "2"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 02 XTRA" 
41.
     REM  --- SIND KEIN FEHLER 0 DATEIEN SIND SCHON VORHANDEN 1 KOPIERT --- 
42.
     IF  "%FEHLERCODE%" == "1"  SET "MsgInfoSwap=%Msg_OK%ROCOPY:STATUS:NOERR 01 COPY" 
43.
     IF  "%FEHLERCODE%" == "0"  SET "MsgInfoSwap=%Msg_OK%ROCOPY:STATUS:NOERR 00 NO CHANGE" 
44.
     ECHO  ##### nachher FEHLERCODE=%FEHLERCODE% ERRORLEVEL=%ERRORLEVEL% ###### 
45.
     CALL :ProMsgWriteToScrAndLog                           & REM *** CREATE INFO -MSG TO SCR UND LOG-                     *** 
46.
     REM --- ROBOCOPY STATUS IN MSG SCHREIBEN WENN ERRORLEVEL >=2 DANN FEHLERMELDUNG ANSONSTEN CHECKEN OB KOPIERT WURDE O ÜBERSPRUNGEN--- 
47.
     IF  "%FEHLERCODE%" GEQ "2" ( 
48.
         SET  /A "Err_Robo=1"                               & REM *** Err_Robo FÜR DIE AUSWERTUNG VON FEHLERN BEI ROBOCOPY *** 
49.
         SET  "MsgInfoSwap=%Msg_ERR%ROCOPY: Fehler beim kopieren %P_Robo_FileS% ERR:%FEHLERCODE%  !." 
50.
         CALL :ProEventLogCreateERR                         & REM *** CREATE EVENT ERROR                                   *** 
51.
         ) ELSE ( 
52.
             IF  "%FEHLERCODE%" == "1" ( 
53.
                   SET  "MsgInfoSwap=%Msg_OK%ROCOPY: FILES: %P_Robo_FileS% wurden kopiert!." 
54.
55.
             IF  "%FEHLERCODE%" == "0" ( 
56.
                  SET  "MsgInfoSwap=%Msg_WAR%ROCOPY: FILES: %P_Robo_FileS% wurden übersprungen!." 
57.
58.
             CALL :ProMsgWriteToScrAndLog                   & REM *** CREATE INFO -MSG TO SCR UND LOG-                    *** 
59.
60.
61.
 
62.
 
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?
IF ERRORLEVEL 17 SET MsgInfoSwap="%Msg_ERR%ROCOPY:STATUS: ERR 17 *ERROR ?? *" 
IF ERRORLEVEL 16 SET MsgInfoSwap="%Msg_ERR%ROCOPY:STATUS: ERR 16 *FATAL ERROR*" 
IF ERRORLEVEL 15 SET MsgInfoSwap="%Msg_ERR%ROCOPY:STATUS: ERR 15 FAIL MISM XTRA COPY" 
IF ERRORLEVEL 14 SET MsgInfoSwap="%Msg_ERR%ROCOPY:STATUS: ERR 14 FAIL MISM XTRA" 
IF ERRORLEVEL 13 SET MsgInfoSwap="%Msg_ERR%ROCOPY:STATUS: ERR 13 FAIL MISM COPY" 
IF ERRORLEVEL 12 SET MsgInfoSwap="%Msg_ERR%ROCOPY:STATUS: ERR 12 FAIL MISM" 
IF ERRORLEVEL 11 SET MsgInfoSwap="%Msg_ERR%ROCOPY:STATUS: ERR 11 FAIL XTRA COPY" 
IF ERRORLEVEL 10 SET MsgInfoSwap="%Msg_ERR%ROCOPY:STATUS: ERR 10 FAIL XTRA" 
IF ERRORLEVEL 9 SET MsgInfoSwap="%Msg_ERR%ROCOPY:STATUS: ERR 09 FAIL COPY" 
IF ERRORLEVEL 8 SET MsgInfoSwap="%Msg_ERR%ROCOPY:STATUS: ERR 08 FAIL" 
IF ERRORLEVEL 7 SET MsgInfoSwap="%Msg_ERR%ROCOPY:STATUS: ERR 07 MISM XTRA COPY" 
IF ERRORLEVEL 6 SET MsgInfoSwap="%Msg_ERR%ROCOPY:STATUS: ERR 06 MISM XTRA" 
IF ERRORLEVEL 5 SET MsgInfoSwap="%Msg_ERR%ROCOPY:STATUS: ERR 05 MISM COPY" 
IF ERRORLEVEL 4 SET MsgInfoSwap="%Msg_ERR%ROCOPY:STATUS: ERR 04 MISM" 
IF ERRORLEVEL 3 SET MsgInfoSwap="%Msg_ERR%ROCOPY:STATUS: ERR 03 XTRA COPY" 
IF ERRORLEVEL 2 SET MsgInfoSwap="%Msg_ERR%ROCOPY:STATUS: ERR 02 XTRA"
Und schau Dir mal folgende Seite an ROBOCOPY Exit Codes

Gruss Penny.
Bitte warten ..
Mitglied: Jochem
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:
01.
setlocal ENABLEDELAYEDEXPANSION 
02.
REM  *** ROBOCOPY FÜR ALLES +FEHLERAUSWERTUNG INS LOG ************************************************************************************** 
03.
REM  ### Var: %P_Robo_Path_Von%      # VON WO KOPIERT WERDEN SOLL NUR PATH C:\TEST\         ### 
04.
REM  ### Var: %P_Robo_Path_Nach%   # WOHIN WIRD KOPIERT WERDEN SOLL NUR PATH C:\TEST\     ### 
05.
REM  ### Var: %P_Robo_FileS%            # ZU KOPIERENDE FILES *.* FÜR ALLE  Z.B DATEI.TXT      ### 
06.
REM  ### Var: %P_Robo_Para%             # PARAMETERÜBERGABE AN ROBOCOPY Z.B /E / PURGE /MIR    ### 
07.
 
08.
:ProRobocopy4Var 
09.
     SET /A  "Err_Robo=0"                                   & REM *** ERRORVARIABLE VON ROBOCOPY AUF 0 SETZEN          *** 
10.
     SET  "MsgInfoSwap=%Msg_OK%ROCOPY:   WAS:%P_Robo_FileS%" 
11.
     CALL :ProMsgWriteToScrAndLog 
12.
     SET  "MsgInfoSwap=%Msg_OK%ROCOPY:   VON:%P_Robo_Path_Von%" 
13.
     CALL :ProMsgWriteToScrAndLog                           & REM *** CREATE INFO -MSG TO SCR UND LOG-                 *** 
14.
     SET  "MsgInfoSwap=%Msg_OK%ROCOPY:  NACH:%P_Robo_Path_Nach%" 
15.
     CALL :ProMsgWriteToScrAndLog                           & REM *** CREATE INFO -MSG TO SCR UND LOG-                 *** 
16.
     IF  /I  "%LogF_Full_Main_Swap%"=="NUL" ( 
17.
         REM  --- NOT WRITE LOGFILE IST NICHT VORHANDEN ALSO NICHT REIN SCHREIBEN AUSGABE IN NULL UMLEITEN --- 
18.
         ROBOCOPY %P_Robo_Path_Von% %P_Robo_Path_Nach% %P_Robo_FileS% %P_Robo_Para% /IS /W:2 /R:10 /COPY:DAT /V /TEE >NUL 
19.
         SET /A "FEHLERCODE=!ERRORLEVEL!"                      & REM *** FEHLER in VARIABLE SPEICHERN *** 
20.
         ) ELSE ( 
21.
             REM  --- WRITE LOGFILE IST VORHANDEN ALSO INS LOGFILE SCHREIBEN --- 
22.
             ROBOCOPY %P_Robo_Path_Von% %P_Robo_Path_Nach% %P_Robo_FileS% %P_Robo_Para% /IS /W:2 /R:10 /COPY:DAT /V /TEE /LOG+:"%LogF_Full_Main%" >NUL 
23.
             SET /A "FEHLERCODE=!ERRORLEVEL!"                      & REM *** FEHLER in VARIABLE SPEICHERN *** 
24.
25.
     ECHO  ##### vorher FEHLERCODE=!FEHLERCODE!###### 
26.
     IF  "!FEHLERCODE!" == "17" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 17 ***ERROR ?? ***" 
27.
     IF  "!FEHLERCODE!" == "16" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 16 ***FATAL ERROR***" 
28.
     IF  "!FEHLERCODE!" == "15" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 15 FAIL MISM XTRA COPY" 
29.
     IF  "!FEHLERCODE!" == "14" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 14 FAIL MISM XTRA" 
30.
     IF  "!FEHLERCODE!" == "13" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 13 FAIL MISM COPY" 
31.
     IF  "!FEHLERCODE!" == "12" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 12 FAIL MISM" 
32.
     IF  "!FEHLERCODE!" == "11" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 11 FAIL XTRA COPY" 
33.
     IF  "!FEHLERCODE!" == "10" SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 10 FAIL XTRA" 
34.
     IF  "!FEHLERCODE!" == "9"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 09 FAIL COPY" 
35.
     IF  "!FEHLERCODE!" == "8"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 08 FAIL" 
36.
     IF  "!FEHLERCODE!" == "7"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 07 MISM XTRA COPY" 
37.
     IF  "!FEHLERCODE!" == "6"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 06 MISM XTRA" 
38.
     IF  "!FEHLERCODE!" == "5"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 05 MISM COPY" 
39.
     IF  "!FEHLERCODE!" == "4"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 04 MISM" 
40.
     IF  "!FEHLERCODE!" == "3"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 03 XTRA COPY" 
41.
     IF  "!FEHLERCODE!" == "2"  SET "MsgInfoSwap=%Msg_ERR%ROCOPY:STATUS:ERR 02 XTRA" 
42.
     REM  --- SIND KEIN FEHLER 0 DATEIEN SIND SCHON VORHANDEN 1 KOPIERT --- 
43.
     IF  "!FEHLERCODE!" == "1"  SET "MsgInfoSwap=%Msg_OK%ROCOPY:STATUS:NOERR 01 COPY" 
44.
     IF  "!FEHLERCODE!" == "0"  SET "MsgInfoSwap=%Msg_OK%ROCOPY:STATUS:NOERR 00 NO CHANGE" 
45.
     ECHO  ##### nachher FEHLERCODE=!FEHLERCODE! ###### 
46.
     CALL :ProMsgWriteToScrAndLog                           & REM *** CREATE INFO -MSG TO SCR UND LOG-                     *** 
47.
     REM --- ROBOCOPY STATUS IN MSG SCHREIBEN WENN ERRORLEVEL >=2 DANN FEHLERMELDUNG ANSONSTEN CHECKEN OB KOPIERT WURDE O ÜBERSPRUNGEN--- 
48.
     IF  "!FEHLERCODE!" GEQ "2" ( 
49.
         SET  /A "Err_Robo=1"                               & REM *** Err_Robo FÜR DIE AUSWERTUNG VON FEHLERN BEI ROBOCOPY *** 
50.
         SET  "MsgInfoSwap=%Msg_ERR%ROCOPY: Fehler beim kopieren %P_Robo_FileS% ERR:!FEHLERCODE! ." 
51.
         CALL :ProEventLogCreateERR                         & REM *** CREATE EVENT ERROR                                   *** 
52.
         ) ELSE ( 
53.
             IF  "!FEHLERCODE!" == "1" ( 
54.
                   SET  "MsgInfoSwap=%Msg_OK%ROCOPY: FILES: %P_Robo_FileS% wurden kopiert." 
55.
56.
             IF  "!FEHLERCODE!" == "0" ( 
57.
                  SET  "MsgInfoSwap=%Msg_WAR%ROCOPY: FILES: %P_Robo_FileS% wurden übersprungen." 
58.
59.
             CALL :ProMsgWriteToScrAndLog                   & REM *** CREATE INFO -MSG TO SCR UND LOG-                    *** 
60.
61.
     )
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
http://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.
01.
@echo off &setlocal 
02.
 
03.
REM Deine ROBOCOPY-Zeile hierher! 
04.
call :robocopycheck %errorlevel% descr 
05.
 
06.
echo Is Error [0/1]: %errorlevel% 
07.
echo Description   : %descr% 
08.
 
09.
pause 
10.
goto :eof 
11.
 
12.
:robocopycheck robocopy_errorlevel [description_variable_name] 
13.
setlocal EnableDelayedExpansion &set /a "return = %~1, err = 0" &set "txt=" 
14.
if !return!==0 (set "txt=NO CHANGE   ") else ( 
15.
  for %%i in ("COPY" "EXTRA" "MISMATCHES" "FAILS" "FATAL ERROR") do (set "bit!err!=%%~i" & set /a "err += 1") 
16.
  if !return! gtr 1 (set "err=1") else set "err=0" 
17.
  for /l %%i in (0 1 4) do (set /a "bit=return & 1, return >>= 1" &if !bit!==1 set "txt=!bit%%i! + !txt!") 
18.
19.
endlocal &if "%~2" neq "" set "%~2=%txt:~0,-3%" &exit /b %err%
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

01.
 
02.
@echo off  
03.
REM ### WARUM LOCALE VARIABLEN ?? ### 
04.
setlocal  
05.
 
06.
REM Deine ROBOCOPY-Zeile hierher!  
07.
 
08.
REM ### wozu steht noch %errorlevel% descr  hinter den Procedure Auruf ? ### 
09.
call :robocopycheck %errorlevel% descr  
10.
echo Is Error [0/1]: %errorlevel%  
11.
echo Description   : %descr%  
12.
pause  
13.
goto :eof  
14.
 REM ### wozu brauch ich das robocopy_errorlevel [description_variable_name] hinter dem Procedureaufruf ?? ### 
15.
:robocopycheck robocopy_errorlevel [description_variable_name]  
16.
rem wozu brauch ich ein Setlocal ??? 
17.
 
18.
REM ### was macht dieses EnableDelayedExpansio genau ? ### 
19.
setlocal EnableDelayedExpansion  
20.
REM ### was passiert hier woher bekommt er den Returnwert ? ### 
21.
set /a "return = %~1" 
22.
SET  "err = 0" 
23.
set   "txt="  
24.
 
25.
 
26.
if !return!==0 ( 
27.
    set "txt=NO CHANGE   " 
28.
    ) else (  
29.
         for %%i in ("COPY" "EXTRA" "MISMATCHES" "FAILS" "FATAL ERROR") do ( 
30.
               set  "bit!err!=%%~i"  
31.
               REM OK ADDIERE NUMERISCHEN ERRORCOUNTER 
32.
               set  /a "err += 1" 
33.
    )  
34.
   REM --- OK Fehlerauswertung --- 
35.
    if  !return! gtr 1 ( 
36.
        set "err=1"  
37.
        ) else (  
38.
              set "err=0"  
39.
40.
    REM ### was passiert hier ? ### 
41.
     for /l %%i in (0 1 4) do ( 
42.
          set /a "bit=return & 1, return >>= 1"  
43.
          if !bit!==1 ( 
44.
              set "txt=!bit%%i! + !txt!" 
45.
46.
      )  
47.
)  
48.
endlocal  
49.
REM ### was passiert hier ? ### 
50.
if "%~2" neq "" ( 
51.
    set "%~2=%txt:~0,-3%" 
52.
    exit /b %err% 
53.
54.
goto :eof 

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:
01.
@echo off 
02.
 
03.
setlocal 
04.
set "n=vorher" 
05.
for /l %%i in (0 1 4) do ( 
06.
  set "n=%%i" 
07.
  echo %n% 
08.
09.
endlocal 
10.
 
11.
echo ~~~~~~~~~ 
12.
 
13.
setlocal EnableDelayedExpansion 
14.
set "n=vorher" 
15.
for /l %%i in (0 1 4) do ( 
16.
  set "n=%%i" 
17.
  echo !n! 
18.
19.
endlocal 
20.
 
21.
pause
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:
     00101 
&    00001 
---------- 
     00001 -> Bit ist gesetzt 
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
 
     00101 >>1 
---------- 
     00010 
&    00001 
---------- 
     00000 -> Bit ist nicht gesetzt 
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
 
     00010 >>1 
---------- 
     00001 
&    00001 
---------- 
     00001 -> Bit ist gesetzt 
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
 
     00001 >>1 
---------- 
     00000 
&    00001 
---------- 
     00000 -> Bit ist nicht gesetzt 
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
 
     00000 >>1 
---------- 
     00000 
&    00001 
---------- 
     00000 -> Bit ist nicht gesetzt
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 funst 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 ????

01.
echo off 
02.
cls 
03.
set /A  "glo_a=1" & REM glogale Variable 
04.
set /A  "loc_a=8" & REM globale  Variable die auch unten ein zweites mal benutzt wird 
05.
 
06.
echo #GLOBAL# global:%glo_a%   
07.
 
08.
setlocal 
09.
     REM local Variable eine andere wie oben da local gleicher name anderer Wert nur in setlocal endlocal gültig 
10.
     set /A  "loc_a=2"                                                                                  
11.
     REM **** HIER FEHLER !!! wie bekomme ich Werte in die wirkliche globale Variable glo_a  
12.
     set /A  "glo_a=loc_a + loc_a" 
13.
     echo #SETLOCAL# global:%glo_a% local: %loc_a% 
14.
     REM *** PROCEDUREAUFRUF  ist der letzt ein Teil von SETLOCAL ENDLOCAL oder ist die Procedure wieder GLOBAL 
15.
     call :test 01 
16.
endlocal 
17.
 
18.
REM HIER WIEDER GLOBAL  
19.
echo #GLOBAL RAUS AUS SETLOCAL# global:%glo_a% local: %loc_a% pause 
20.
exit 
21.
 
22.
REM  GLOBALE VARIABLE INPROCEDURE ÄNDERN 
23.
:test 01 
24.
        set /A  "glo_a=loc_a + loc_a + loc_a" 
25.
        echo #PROC# global:%glo_a% local: %loc_a%  
26.
GOTO :EOF 
27.
 
28.
ERGEBNIS: FALCH glo_a hat falschen Wert 
29.
 
30.
#GLOBAL# global:1                                                            OK 
31.
#SETLOCAL# global:4 local: 2                                            OK 
32.
#PROC# global:6 local: 2                                                    OK 
33.
#GLOBAL RAUS AUS SETLOCAL# global:1 local: 8      NOK 
34.
 
35.
REM  hier muss  global 6 stehen und nicht 1

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
endlocal &set "glo_a=%glo_a%"
oder zu
  endlocal 
  set "glo_a=%glo_a%" 
)
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 funst das in CMD
da kommt wieder nur Mist raus ????
Eine Möglichkeit habe ich oben schon gezeigt. Es gibt noch weitere. 2 Beispiele.
01.
@echo off &setlocal 
02.
set "glob=irgendwas" 
03.
set /a "x=1, y=2" 
04.
call :proc 
05.
set /a "glob=%errorlevel%" 
06.
echo %glob% 
07.
pause 
08.
goto :eof 
09.
 
10.
:proc 
11.
setlocal 
12.
set /a "loc = x + y" 
13.
14.
  endlocal 
15.
  exit /b %loc% 
16.
)
... 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:
01.
@echo off &setlocal 
02.
set "glob=irgendwas" 
03.
set /a "x=1, y=2" 
04.
call :proc addiere 
05.
echo %glob% 
06.
pause 
07.
goto :eof 
08.
 
09.
:proc 
10.
if "%~1"=="addiere" ( REM ziemlich sinnloses IF Statement, nur zur Verdeutlichung ... 
11.
  setlocal EnableDelayedExpansion 
12.
  set /a "loc = x + y" 
13.
  for /f "delims=" %%i in ("!loc!") do ( 
14.
    endlocal 
15.
    set "glob=%%i" 
16.
17.
18.
goto :eof
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 ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (15)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...