2012-04-13 13 views
42

czy istnieje coś, co naśladuje metodę podobną do tej znanej z Javy, C# itd.? Mam 5 linii poleceń w pliku wsadowym, te 5 linii jest używanych w więcej niż jednym miejscu wewnątrz pliku wsadowego. Nie mogę użyć goto, ponieważ w zależności od poziomu błędu utworzonego przez te 5 linii mam różne akcje, które następują. Próbowałem umieścić moje 5 wierszy w pliku wsadowym 5lines.bat, ale oryginalny plik wsadowy original.bat wywołuje tylko 5lines.bat i nie wykonuje poleceń po wywołaniu 5lines.bat): Tak wygląda mój image.bat na przykład:Coś jak funkcja/metoda w plikach wsadowych?

5lines.bat 
echo this gets never called, how to make sure this gets called? 

Nie ma wyjścia lub czegoś takiego w 5lines.bat! Jak mogę się upewnić, że linia po wywołaniu 5lines.bat zostanie wywołana?

Odpowiedz

16

Umieszczenie funkcji wielokrotnego użytku do osobnego pliku wsadowego będzie na pewno działa, aby symulować funkcję.

Połów jest taki, że musisz użyć polecenia call, aby upewnić się, że sterowanie powraca do osoby wywołującej po zakończeniu wykonywania drugiego pliku wsadowego.

call 5lines.bat 
echo this will now get called 
+0

Doskonale, dziękuję! –

56

Można użyć polecenia rozmowy:

call:myDosFunc 

A potem zdefiniować funkcję w ten sposób:

:myDosFunc - here starts the function 
echo. here the myDosFunc function is executing a group of commands 
echo. it could do a lot of things 
goto:eof 

Źródło: Batch Functions

+0

Dziękuję za polecenie wezwanie było istotnie to, czego mi brakowało. –

+0

Nie ma problemu! Cieszę się, że to się udało! – Erwald

+5

Ale jak to działa? Jaka jest magia w tym 'goto: eof'? – Calmarius

4

Można spróbować użyć przykłady wymienione na this page

Alternatywnie, można umieścić wspólne linie do innego pliku wsadowego, że zadzwonisz z głównego jednej

+0

Świetny link! (chociaż skończyło się po prostu na wywołaniu 5lines.bat) –

7

Rozwiązanie:

@ECHO OFF  

call:header Start Some Operation 

... put your business logic here 
... make sure EXIT below is present 
... so you don't run into actual functions without the call 

call:header Operation Finished Successfully 

EXIT /B %ERRORLEVEL% 

:: Functions 

:header 
ECHO ================================================= 
ECHO %* 
ECHO ================================================= 
EXIT /B 0 

Ważne umieścić EXIT/B na końcu każdej z funkcji, a także przed rozpoczęciem definicje funkcji, w moim przykładzie jest to:

EXIT/B % ERRORLEVEL%

1

Oto „włamać”, który pozwoli Ci mieć "anonymous" functions w plikach wsadowych:

@echo off 
setlocal 
set "anonymous=/?" 

:: calling the anonymous function 
call :%%anonymous%% a b c 3>&1 >nul 

:: here the anonymous function is defined 
if "%0" == ":%anonymous%" (
    echo(
    echo Anonymous call: 
    echo %%1=%1 %%2=%2 %%3=%3 
    exit /b 0 
)>&3 
::end of the anonymous function 

Anonimowy Blok powinien być umieszczony zaraz po zestawieniu połączenia i musi kończyć się stwierdzeniem wyjścia

Sztuką jest to, że CALL wewnętrznie używa GOTO a następnie powraca do linii, gdzie CALL został stracony. Po dwukrotnym rozwinięciu pojawia się komunikat pomocy GOTO (z argumentem %%/?%%), a następnie kontynuuje skrypt. Ale po jego zakończeniu wraca do CALL - dlatego potrzebne jest wyrażenie if.

3

Tylko dla kompletności, można również przekazać parametry do funkcji:

wywołanie funkcji

call :myDosFunc 100 "string val" 

ciało Funkcja

:myDosFunc 
echo. Got Param#1 %~1 
echo. Got Param#2 %~2 
goto :eof 
Powiązane problemy