kibatsu
Goto Top

ERRORLEVEL-Parameter von einer Batch in eine andere übergeben, OHNE dass ERRORLEVEL bereits ausgeführt wird

Hallo,

ich will / muss mehrere Dateien von unserem Server auf SD-Karten überspielen und vorher ggf. die SD-Karten löschen, falls noch etwas darauf sein sollte.

Damit das Ganze schneller geht habe ich 4 CardReader zusammengebastelt und über ein Hub an den Rechner angeschlossen. Dazu habe ich mir ein Batch erstellt mit einem Menü, dass abfragt, welche Laufwerke bespielt werden sollen.

Entsprechung den Angaben des Benutzers erstellt die Batch dann eine Art Sammelbatch, welche dann die ebenfalls angelegten Batches für die einzelnen angegebenen Laufwerke startet, ergo 1 Batch startet gleichzeitig 4 Batches, welche dann die Datein vom Server gleichzeitig auf alle SD-Karten kopiert ...

Die 4 erstellten Batches sollen auch eine Fehlerabfrage mittels %ERRORLEVEL% machen und ggf. Bescheid sagen, falls Datein nicht kopiert werden konnten.

Mein Problem:
Wenn ich von der 1. Batch (die, die anderen 4 und die Sammelbatch generiert) ECHO %ERRORLEVEL% >> bla.bat verwende, führt er %ERRORLEVEL% bereits hier aus und gibt in der Regel natürlich den Wert 0 weiter.

In meinen 4 erzeugten Batches habe ich dann also keine IF %ERRORLEVEL%==0 Fehlerabfrage mehr, sonder nur noch IF 0==0, da er den %ERRORLEVEL% ja schon gechecked und das negative Ergebnis ja schon weitergegeben hat.

Auf jeden Fall besten Dank an den, der mir hier weiterhelfen kann!


Mit freundlichem Gruße

Kibatsu

Content-Key: 62566

Url: https://administrator.de/contentid/62566

Printed on: April 24, 2024 at 04:04 o'clock

Member: bastla
bastla Jun 28, 2007 at 09:08:47 (UTC)
Goto Top
Hallo Kibatsu und willkommen im Forum!

Eigentlich ist mir das Problem nicht klar - wenn in einem der 4 "Unter"-Batches ein Kopierfehler auftritt, kannst Du diesen ja dort abfangen und entsprechend darauf reagieren ...

Vielleicht stellst Du besser einmal etwas Code herein.

Grüße
bastla
Member: Biber
Biber Jun 28, 2007 at 09:12:03 (UTC)
Goto Top
Moin Kibatsu,

willkommen im Forum.

Kannszt Du biite die handvoll relevanter Zeilen posten, also
  • das erstmalige Setzen der Errorlevels in der Hauptbatch
  • die Aufrufe (CALLs?) der Unterbatche
  • und bitte eine Verdeutlichung, ob/wie Du die Unterbatche "generierst".

Dann gehts schneller.

Grüße
Biber
Member: Kibatsu
Kibatsu Jun 28, 2007 at 09:39:37 (UTC)
Goto Top
Auf jeden Fall schon mal besten Dank für die schnelle Rückmeldung ;)
Anbei die denke ich mal relevantesten Zeilen:


:: Abfrage und Festlegung der Variablen

:FIRSTCHOICE
:: SET /P prompted und legt die Variable fest (z.B. F in dem Fall hier)
SET Choice1=
SET /P Choice1=1. Laufwerk:
:: Die folgende Syntax startet den Substring (bei 0 und 1 Zeichen lang)
IF NOT '%Choice1%'=='' SET Choice1=%Choice1:~0,1%


(An der Stelle kommen hier 4 Abfragen, für die 4 Laufwerke, die bespielt werden sollen, ergo :SECONDCHOICE, 3rd, etc...)


:: Pfaderstellung für die dynamischen Leufwerke
IF EXIST C:\Dokumente" "und" "Einstellungen\%USERNAME%\Anwendungsdaten\Batch\ RD /S /Q C:\Dokumente" "und" "Einstellungen\%USERNAME%\Anwendungsdaten\Batch
MKDIR "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch"


:: Dynamische Erzeugung der Laufwerke und Löschung, fall bereits vorhanden

IF EXIST "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat" DEL /F "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"

!!! Jetzt keinen Schreck kriegen, nach dem dicken Block kommt nochmal das Endergebnis, aber der sollte mit rein, damit man den Fehler sehen kann !!!

ECHO @echo OFF >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO. >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO IF EXIST %Choice1%:\ GOTO CHECKFILES >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO ECHO Es befindet sich kein Datentraeger im Laufwerk %Choice1%:\ >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO PAUSE >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO EXIT >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO. >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO :CHECKFILES >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO IF EXIST "S:\neueste Version\" GOTO DELETE >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO ECHO Die Quelldatei(en) auf dem Server konnten nicht gefunden werden oder es besteht keine Verbindung zum Netzwerk. >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO PAUSE >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO EXIT >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO. >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO :DELETE >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO :: Entfernen des Verzeichnisses inkl. aller Unterverzeichnisse ohne Abfrage >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO RD /S /Q %Choice1%:\ >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO. >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO :: Kopiervorgang vom Server auf die SD-Card >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO ECHO Die Datei(en) werden nach %Choice1%:\ kopiert. Bitte Warten . . . >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO XCOPY /I /C /E /Q /Y "S:\neueste Version\*.*" %Choice1%:\ >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO. >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO :: Überprüfung des Kopiervorganges (bei Erfolg Fenster schließen, sonst Fehlermeldung ausgeben) >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO IF %ERRORLEVEL%==0 GOTO NOERROR >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO CLS >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO ECHO Die Datei(en) konnten nicht kopiert werden. >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO PAUSE >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO EXIT >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO. >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO :NOERROR >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"
ECHO EXIT >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"


Dieser gesammte Block sieht dann in den neu angelegten Datein dann so aus:

@echo OFF

IF EXIST F:\ GOTO CHECKFILES
ECHO Es befindet sich kein Datentraeger im Laufwerk F:\
PAUSE
EXIT

:CHECKFILES
IF EXIST "S:\neueste Version\" GOTO DELETE
ECHO Die Quelldatei(en) auf dem Server konnten nicht gefunden werden oder es besteht keine Verbindung zum Netzwerk.
PAUSE
EXIT

:DELETE
:: Entfernen des Verzeichnisses inkl. aller Unterverzeichnisse ohne Abfrage
RD /S /Q F:\

:: Kopiervorgang vom Server auf die SD-Card
ECHO Die Datei(en) werden nach F:\ kopiert. Bitte Warten . . .
XCOPY /I /C /E /Q /Y "S:\neueste Version\*.*" F:\

:: Überprüfung des Kopiervorganges (bei Erfolg Fenster schließen, sonst Fehlermeldung ausgeben)
IF 0==0 GOTO NOERROR (<--- HIER IST DER FEHLER!!!)
CLS
ECHO Die Datei(en) konnten nicht kopiert werden.
PAUSE
EXIT

:NOERROR
EXIT


Hier dann der letzte Teil, der die Sammelbatch auf dem Desktop des Benutzers anlegt:

:: Abfrage, ob noch eine alte Version auf dem Desktop des Benutzers liegt, wenn ja, dann löschen

IF EXIST "C:\Dokumente und Einstellungen\%USERNAME%\Desktop\SD-Card Patcher.bat" DEL /F "C:\Dokumente und Einstellungen\%USERNAME%\Desktop\SD-Card Patcher.bat"

ECHO @echo OFF >> "C:\Dokumente und Einstellungen\%USERNAME%\Desktop\SD-Card Patcher.bat"
ECHO. >> "C:\Dokumente und Einstellungen\%USERNAME%\Desktop\SD-Card Patcher.bat"

ECHO START C:\Dokumente" "und" "Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk" "%Choice1% >> "C:\Dokumente und Einstellungen\%USERNAME%\Desktop\SD-Card Patcher.bat"
ECHO START C:\Dokumente" "und" "Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk" "%Choice2% >> "C:\Dokumente und Einstellungen\%USERNAME%\Desktop\SD-Card Patcher.bat"
ECHO START C:\Dokumente" "und" "Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk" "%Choice3% >> "C:\Dokumente und Einstellungen\%USERNAME%\Desktop\SD-Card Patcher.bat"
ECHO START C:\Dokumente" "und" "Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk" "%Choice4% >> "C:\Dokumente und Einstellungen\%USERNAME%\Desktop\SD-Card Patcher.bat"
ECHO. >> "C:\Dokumente und Einstellungen\%USERNAME%\Desktop\SD-Card Patcher.bat"
ECHO :: Erstellt am %DATE% um %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2% von %USERNAME% >> "C:\Dokumente und Einstellungen\%USERNAME%\Desktop\SD-Card Patcher.bat"

ECHO.
ECHO Der SD-Card Patcher wurde mit den von Ihnen angegebenen Laufwerken auf Ihrem Desktop hinterlegt.
ECHO.

PAUSE
EXIT


Die ganzen Befehle werden ja durch den ECHO Befehl weitergegeben in die neuen Datein, nur eben %ERRORLEVEL% wird halt BEREITS BEIM weitergeben ausgeführt und liefert dass Ergebnis 0
-> IF 0==0 GOTO NOERROR

Was ich möchte ist natürlich, dass die 4 Unterbatches am Ende %ERRORLEVEL% checken und NICHT der Batch-Generator.


Nochmals vielen Dank an all jene, die sich den ganzen Batzen durchgelesen haben! ;)
Member: bastla
bastla Jun 28, 2007 at 09:51:33 (UTC)
Goto Top
Hallo Kibatsu!

!!! Jetzt keinen Schreck kriegen ...
Wir sind hier nicht so leicht zu erschrecken ... face-wink

Versuch es mit folgender Zeile:
ECHO IF ^%ERRORLEVEL^%==0 GOTO NOERROR >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"  
Mit den ^ maskierst Du die %-Zeichen, dadurch werden sie nicht als "Steuerzeichen" interpretiert.

Grüße
bastla
Member: Kibatsu
Kibatsu Jun 28, 2007 at 11:45:46 (UTC)
Goto Top
Hallo bastla!

ECHO IF ^%ERRORLEVEL^%==0 GOTO NOERROR

hat in den 4 Unterbatches leider nur zu

IF ==0 GOTO NOERROR geführt anstatt zu
IF %ERRORLEVEL%==0 GOTO NOERROR

Noch irgendwelche anderen Vorschläge?


Gruß, Kibatsu
Member: bastla
bastla Jun 28, 2007 at 11:53:38 (UTC)
Goto Top
Hallo Kibatsu!

Sorry, nur am Prompt getestet ...

Jetzt aber (mit je einem % mehr):
ECHO IF ^%%ERRORLEVEL^%%==0 GOTO NOERROR >> "C:\Dokumente und Einstellungen\%USERNAME%\Anwendungsdaten\Batch\Laufwerk %Choice1%.bat"  

Grüße
bastla
Member: Kibatsu
Kibatsu Jun 28, 2007 at 12:01:04 (UTC)
Goto Top
Hallo bastla,

Jetzt aber (mit je einem % mehr):
ECHO IF ^%%ERRORLEVEL^%%==0 GOTO NOERROR

daran lag's! Nun funktioniert alles. Wer soll denn auf sowas kommen ... -.-"

Ich dank dir vielmals! ;)


Kibatsu
Member: Biber
Biber Jun 28, 2007 at 14:27:53 (UTC)
Goto Top
Hallo Kibatsu,

Fussnote zu bastlas Lösung:

Ausreichend wäre auch ein einfaches
ECHO IF %%ERRORLEVEL%%==0 GOTO NOERROR >>....
...also ohne die Maskierung mit dem Caret ("^").

Aber da es so oder so funktioniert, setze ich mal den Beitrag auf gelöst.

Grüße
Biber