landstreicher
Goto Top

Batch startet andere Batch errorlevel übergabe von 2ter an 1te batch ?

Hallo,

ich habe ein Problem, was sich einfach nicht von selbst in Luft auflösen will.
Ich habe eine Batch :

@echo off
echo. >D:\cognos\Contributor\Macros\exec.txt
title Upload_Macro-Ausfuehrung
:importerstellung
cls
if "%1"=="" goto :eingabe_importerstellung  
set batchname=\%1
goto :ausgabe_importerstellung

:eingabe_importerstellung
echo ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
echo º Info:                                                                     º
echo º Macros werden erstellt, ohne den Contributor starten zu mussen ausgefuhrt º
echo º Kompletten Makronamen eingeben (bei mehreren, wird eine Queue erstellt    º
echo º Eingabe "start" um die Queue zu starten (statt Macronamen)                º  
echo º Eingabe "erstell" um eine Batch zu erstellen (statt Macronamen)           º  
echo ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
echo; 
Echo  Auszufuehrende Makros : 
echo  _______________________  
echo;       
for /F "tokens=1-10 delims=<> " %%a in ('findstr bat D:\cognos\Contributor\Macros\exec.txt') do echo  %%a  
echo ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
set /p Batchname=Appl. - MakroNamen eingeben:
if "%batchname%"=="start" goto :endstep  
if "%batchname%"=="erstell" goto :startup  
if "%batchname%"=="list" goto :list_verzeich  
goto :ausgabe_importerstellung

:ausgabe_importerstellung
echo Ausgabe zur Kontrolle:
echo Batchname=%batchname%.bat
if "%batchname%"=="start" goto :endstep  
echo;
goto :kontrolle_importerstellung

:kontrolle_importerstellung
::dir D:\cognos\Contributor\Macros\%batchname%.bat
if exist D:\cognos\Contributor\Macros\%batchname%.bat goto :batchimportstandart
if not exist D:\cognos\Contributor\Macros\%batchname%.bat goto :stop_yet
GOTO :kontrolle_importerstellung

:batchimportstandart
REM Die Variablen können editiert werden
set zielpfad="D:\cognos\Contributor\Macros\%batchname%.bat"  
set macroname=%batchname%
ping 127.0.0.1 -n 3 >nul
echo %Batchname%.bat >>D:\cognos\Contributor\Macros\exec.txt
goto :importerstellung

:endstep
echo endemarke >>D:\cognos\Contributor\Macros\exec.txt
goto :start_upload

:start_upload
call "D:\cognos\Utils\upload_macros\ausfuehrung_contributor_macors.bat"  
goto :next_step

:next_step
for /F "tokens=1-10 delims=<> " %%i in ('findstr endemarke D:\cognos\Contributor\Macros\exec.txt') do echo alle Macros wurden ausgefuehrt, dennoch sollten diese auf fehlerfreien lauf geprueft werden.  
goto :eingabe_importerstellung

:stop_yet
echo das angebene macro existiert nicht!
echo entweder wurde die dazugehoerige Batch nie erstellt
echo oder es gibt gar kein Macro im Contributor.
echo 1) starte den Contributor und kontrolliere ob es diese Macro gibt!
echo 2) wenn ja erstelle die Batch gib "erstell" ein  
goto :eingabe_importerstellung

:startup
call D:\cognos\Batcherstellung.exe
goto :eingabe_importerstellung

:list_verzeich
start "title batchlist" dir /b /tc D:\cognos\Contributor\Macros\*.bat   
goto :eingabe_importerstellung

hier wird nun angegeben, welche batch(es) ich ausführen will.
sollte die batchdatei nicht existieren, so wird ein anderes programm gestartet mit der man diese erstellen kann.
soweit auch alles noch in ordnung

hat man nun alle batches angegeben gibt man "start" ein um diese nacheinander anzustarten dazu wird eine andere batch angestartet  

for /F "tokens=1-10 delims=<> " %%a in ('findstr bat D:\cognos\Contributor\Macros\exec.txt') do call :ProcessFile "%%a"  
:ProcessFile
set "Variable=%~1"  
echo fuehre macro %Variable% aus
call D:\cognos\Contributor\Macros\%Variable%
if errorlevel 0 goto :eof
if errorlevel 1 goto :frage
if errorlevel 2 goto :frage

:frage 
Echo;
Echo Ein Fehler wurde festgestellt beim ausfuehren des Macros %Variable%,
echo soll das naechste Macro trotzdem angestartet werden ?
echo oder soll das fehlerhafte Macro erneut gestartet werden ?
SET /P Choice=[J] fuer erneuter Lauf, [N] naechstes Upload_Macro: 
IF NOT '%Choice%'=='' SET Choice=%Choice:~0,1%  
IF /I '%Choice%'=='N' GOTO :eof  
IF /I '%Choice%'=='J' GOTO :ProcessFile  

IF /I '%Choice%'=='n%' GOTO error  

Echo FALSCHE EINGABE von Terminal %COMPUTERNAME% !!!!!
:error
ping 127.0.0.1 -n 3 >nul
goto :start

if not "%1"=="" goto :start  

:eof
auch das funktioniert soweit.

jetzt der knackpunkt bei :frage soll er abfangen ob die ausgeführte batch mit errorlevel 1 oder 2 beendet wurde.
denn sollte eine batch abbrechen darf die andere nicht so einfach weiterlaufen und deswegen auch die frage.

kann mir da jemand weiter helfen ?

als hinweis .. ich kann die batches die ausgeführt werden nicht verändern .... zumindest nicht ohne weiteres

gruß landstreicher

PS wie kann man das "batchgeschreibsel" von seinem beitragstext sichtbar trennen wie es in anderen beiträgen sichtbar ist ???

Content-Key: 74667

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

Printed on: April 18, 2024 at 00:04 o'clock

Member: Biber
Biber Nov 28, 2007 at 17:53:07 (UTC)
Goto Top
Moin Landstreicher,

erstmal nur vorab eine kurze Antwort zu Deinem P.S.:
PS wie kann man das "batchgeschreibsel" von seinem beitragstext sichtbar trennen wie es in anderen beiträgen sichtbar ist ???

Indem Du die Formatierungstags verwendest.
Details siehe in den FAQ unter "Formatierungshilfen".

So, dennoch muss ich Dich erstmal mit Deinem Elend allein lassen - ich schau später noch mal auf den eigentlichen Batch, falls er bis dahin nicht erledigt ist.

Grüße
Biber
Member: bastla
bastla Nov 28, 2007 at 18:19:20 (UTC)
Goto Top
Hallo Landstreicher!

Soferne das Problem darin besteht, dass ":frage" trotz korrekter Übergabe eines Errorlevels <> 0 nie erreicht wird, müsste es eigentlich genügen, aus
if errorlevel 0 goto :eof
if errorlevel 1 goto :frage
if errorlevel 2 goto :frage
ein
if not errorlevel 1 goto :eof
zu machen.

Die Begründung dafür findest Du mit "if /?", oder auch gleich hier face-wink:
  ERRORLEVEL Nummer Bedingung ist erfüllt, wenn das zuletzt ausgeführte
                    Programm einen Code größer oder gleich der Nummer
                    zurückgibt.

Eine weitere Möglichkeit wäre die Abfrage der Variablen %errorlevel%, etwa mit
if %errorlevel%==0 goto :eof

Grüße
bastla
Member: Landstreicher
Landstreicher Nov 29, 2007 at 11:33:04 (UTC)
Goto Top
danke @ Biber

Moin Bastla,

ich glaub ich hab mich gestern doof ausgedrück (sorry war extrem kaputt).

Also es ist so das die Batchdatei die ausgeführt wird ein programm aufruft, welches aus welchen gründen auch immer abbrechen könnte oder seine aktion nicht zuende führen kann.
dann wird in der batch ein errorlevel zurückgegeben (meistens 2).
allerdings wird diese batch wiederum von einer anderen batch angestartet und diese batch soll nun das errorlevel der anderen auslesen.
ich habe allerdings das gefühl, das geht wirklich nur, wenn ich das mit einer variable mache, oder ?


kurzform


batch startet batch und diese startet ein programm
prgramm kann abbrechen, bacht bekommt errorlevel und soll es an erste batch übergeben damit ggf. nachgestartet werden kann.

grüße landstreicher und wie immer besten dank im vorraus
Member: Biber
Biber Nov 29, 2007 at 11:44:28 (UTC)
Goto Top
Moin Landstreicher,

der Weg zur Antwort führt über den EXIT-Befehl.
>help exit
Beendet den Befehlsinterpreter CMD.EXE oder die aktuelle Batchdatei.

EXIT [/B] [exitCode]

  /B          Beendet das aktuelle Batchprogramm anstatt CMD.EXE.
              Wenn diese Option außerhalb eines Batchprogramms aufgerufen
              wird, wird CMD.EXE beendet.

  ExitCode    Gibt die Zahl an, die an ERRORLEVEL übergeben wird, wenn die
              Option /B angegeben wurde. Wenn CMD.EXE beendet wird, wird diese
              Zahl als "Process Exit Code" übergeben.  

Die Batchdatei, die Success/InDieGrützeGehen der EXE-Datei mitbekommt, muss einen entsprechend "verabredeten" Errorlevel weiterreichen.

Beispiel
:: äußere Batchdatei
....
call MeinSklave.bat
If not errorlevel 1 goto :allesPrima
...

Aufgerufene Batch
::meinSklave.bat
....
MachMirDie.exe
Exit /b %errorlevel%
::rem Oder was immer "verabredet" ist  

Grüße
Biber
Member: Landstreicher
Landstreicher Dec 05, 2007 at 11:02:18 (UTC)
Goto Top
Hey Biber,

schau an es wirkt ... war ja auch nicht anders zu erwarten face-wink

besten dank.
Member: Biber
Biber Dec 05, 2007 at 11:49:34 (UTC)
Goto Top
Moin Landstreicher,

besten dank.
Dafür nich'.

Kannst Du das nächste Mal, wenn wir wieder so weit kommen sollten, in dieser Phase des Threads bitte den kleinen grünen Haken...???

Diesmal mach ich das. Is' ja bald Weihnachten...

Grüße und Dank für das Feedback
Biber