knumskull
Goto Top

Exitvalue für Subroutine

Hallo,

gibt es eine Möglichkeit, den Aufruf eine Subroutine mittels Exitvalue zu überprüfen?

@echo off
echo Mache was

call :subroutine
if %errorlevel%==20 echo HALLO
goto :eof

:subroutine
echo Mache nix
exit /b 20

Das funktioniert nicht, da er mir die ganze Shell beendet. Gibt es dafür eine Möglichkeit?
Ich möchte eine Subroutine aufrufen und hinterher die Möglichkeit haben, auf mehrere Varianten zu überprüfen.

Gruß,
Steffen

Content-Key: 115907

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

Printed on: April 25, 2024 at 23:04 o'clock

Mitglied: 60730
60730 May 12, 2009 at 15:11:21 (UTC)
Goto Top
Servus,

das exit am ende der Sub ist das ende des scriptes.
Von daher face-wink

@echo off
echo Mache was

call :subroutine
echo HALLO
if %errorlevel%==20 echo HALLO Fehler20

call :subroutine
echo HALLO2
if %errorlevel%==20 echo HALLO2 Fehler20
goto :eof


:subroutine
echo Mache nix
:eof

(edit)
vielleicht wird es "so" deutlicher...
@echo off
echo Mache was

call :subroutine Hallo

call :subroutine Moin

call :subroutine Abend


goto :eof

:subroutine
echo %1
:eof
(/edit)

Gruß
Mitglied: 77559
77559 May 12, 2009 at 15:42:49 (UTC)
Goto Top
Zitat von @60730:
Servus,

das exit am ende der Sub ist das ende des scriptes.

Hallo Timo,
da liegst du falsch. Problem ist das er den Batch nicht aus einer Shell heraus startet und
ein goto :eof ohne eine vorherige Pause macht.

Er hat also gar keine Gelegenheit das richtige Ergebnis zu sehen weil das Fenster sofort weg ist.

Dies funktioniert sehr wohl und es gibt auch eine Variante mit bedingter Ausführung:
@echo off
echo Main Mache was

call :subroutine
if %errorlevel%==20 echo HALLO

call :subroutine || echo Return mit ERR:%ErrorLevel%

Pause
goto :eof

:subroutine
echo subroutine Mache nix
exit /b 20

Gruß
LotPings
Member: Biber
Biber May 12, 2009 at 15:58:10 (UTC)
Goto Top
Moin Knumskull,

ich hab keine Ahnung, wofür das gut sein soll....
Geht es um eine Wette - dann hätte ich gern anteilig 1/24 davon, falls es um eine Kiste Becks gehen sollte.

@echo off
echo Mache was

call :subroutine
@echo Errorlevel [%errorlevel%]
if %errorlevel%==20 echo HALLO
goto :eof

:subroutine
echo Mache nix
Cmd /c exit /b 20
goto :eof
Demo:
>e:\schnipsel\errorlevel20test.cmd
Mache was
Mache nix
Errorlevel [20]
HALLO

Grüße
Biber
Member: Knumskull
Knumskull May 12, 2009 at 16:21:56 (UTC)
Goto Top
Vielen Dank für die zahlreichen Antworten. Nein es geht um keine Wette face-smile ... aber wenn du in der Nähe wohnst, können wir gern mal ein Bierchen trinken face-smile

Mein Problem ist einfach, das ich eine Routine aufrufe, die unterschiedliche Möglichkeiten der Rückgabe haben muss, weil ich anhand der Rückgabe wieder unterscheiden muss, wie ich weiter mache.

Eigentlich sollte man das ganze schon eher in ner richtigen Programmiersprache machen, aber wenn es trotzdem noch geht. Umso besser ;)

also ich werde das morgen mal testen.

P.S.: Es geht um eine SSH-Verbindungsinitialisierung und automatischem Schlüsselaustausch zw. Windows und Linux.

Benötige ich für einen Job-Aufruf ... alles nicht so einfach ^^
Member: Biber
Biber May 12, 2009 at 17:05:24 (UTC)
Goto Top
Moin Knumskull,

dann nochmal etwas ernsthafter.

Wenn Du tatsächlich
  • eine Unterroutine aufrufst, die verschiedene Fehlercodes oder Errorlevel setzt,
  • die Du dann im Haupt-Teil meinetwegen nach "wenn Fehlercode größer 10, dann brich ab" auswertest

--> dann mach das mit einer selbst angelegten "Private"-Variablen "Fehlercode" oder "myErrorLevel".

Die "Umgebungsvariable" %Errorlevel% wird sowohl von internen wie von externen Befehlen gesetzt, d.h Du kannst ja nicht mal sicher sein, wie lange dieser per EXIT /B gesetzte Wert so bleibt.
Oder hast Du schon mal probiert, ob z.B. eine dazwischengeschobene Kommentarzeile mit REM nicht vielleicht wieder das %ErrorLevel% auf 0 zurücksetzt?

Grüße
Biber
Member: Knumskull
Knumskull May 12, 2009 at 17:10:39 (UTC)
Goto Top
Oder hast Du schon mal probiert, ob z.B. eine dazwischengeschobene
Kommentarzeile mit REM nicht vielleicht wieder das %ErrorLevel% auf 0
zurücksetzt?


Ich nicht, aber du? Wenn du sowas schreibst? Ist es so?

hm ... mit einer selbst definierten Variable habe ich dann wieder das Problem, das ich die nicht ohne delayedexpansion während der laufzeit ausweren kann. Eigentlich wollte ich diesmal ohne dem auskommen ... aber du hast recht, sinnvoller ist es ja eigentlich schon.

Oder is muss mehrere Vars verwenden ... na mal schauen ... muss mir das morgen nochmal anschauen. Hab den Kram zum Glück grad nicht vor mir liegen ...