Sådan opsiges en Windows-batchfil fra en 'call'ed-rutine'?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en Windows-batchfil, med nogle få subrutiner i det, sådan noget:


call :a
goto :eof

:a
call :b
goto :eof

:b
:: How do I directly exit here from here?
goto :eof


Jeg kører dette i et cmd-vindue på Vista.

Hvis jeg opdager en fejl et eller andet sted i batchfilen, vil jeg gerne afslutte det med et fejlfelt uden fejl. Er der noget, jeg kan skrive i rutinen: b, der vil medføre, at batchfilen opsiges som denne.



  • Jeg har prøvet 'exit', som lukker hele cmd-vinduet. Det er ikke det jeg vil have.

  • Jeg har prøvet 'exit/B 1'. Det vender tilbage til den forrige rutine. For at bruge denne ordning efter hvert 'opkald' skal jeg skrive omhyggeligt 'hvis errorlevel 1 exit/B 1' efter hver enkelt ' ring 'for at videregive fejlen tilbage opkaldstabellen. Jeg foretrækker ikke at skrive denne linje efter hvert opkald.



Denne artikel var interessant, men ikke af alternativerne opfører mig som jeg vil. http://www.computerhope.com/exithlp.htm[12]


Er der en anden måde?


Tak.

Bedste reference


Du kan ringe til dine underrutiner som sådan:


call :b||exit /b 1


hvilket svarer til


call :b
if errorlevel 1 exit /b 1


Det er lidt kortere og sparer dig en linje, men det er stadig ikke ideelt, jeg er enig.


Bortset fra det ser jeg ikke en vej.


EDIT: Ok, jeg fik en måde, men det er Pure Evil ™.


Misbrug af den maksimale stakstørrelse og dermed rekursionsgrænsen skaber vi en anden subrutine, der blot udstøder stakken ved rekursivt at kalde sig selv:


@echo off
echo Calling a
call :a
echo Called a
goto :eof
:a
echo Calling b
call :b
echo Called b
goto :eof
:b
echo Trying to exit
call :exit
goto :eof
:exit
call :exit


Dette vil dog resultere i den ubehagelige fejlmeddelelse


******  B A T C H   R E C U R S I O N  exceeds STACK limits ******
Recursion Count=704, Stack Usage=90 percent
******       B A T C H   PROCESSING IS   A B O R T E D      ******


Det tager også ca. 2 sekunder på min maskine.


Du kan undertrykke fejlmeddelelsen ved at ændre call sætningen som følger:


call :exit >nul 2>&1


som vil omdirigere alt, hvad den ønsker at producere i et stort tomrum.


Men i betragtning af den tid det tager at fylde stakken, tror jeg den første variant ville være lettere.


Jeg overvejede også at bruge en anden batchfil, som, når du kører uden call, ville i det væsentlige stoppe den første. Men på en eller anden måde spiller det ikke godt med subrutiner. Udrulning af opkaldsstakken forekommer tilsyneladende stadig sted.

Andre referencer 1


Du kan oprette en exit.bat-fil, der dræber den bedste batfil ved titelnavn.


Eksempel:


A.bat


@echo off
title A.bat
echo A.bat
call B.bat
echo A.bat


B.bat


@echo off
echo B.bat
exit.bat A.bat
echo B.bat


Exit.bat


@echo off
echo exit.bat
kill \%1