Szukaj…


Uwagi

Możesz dodać zmienne początkowe do funkcji, dodając <parameter> do jej etykiety. Dostęp do tych zmiennych początkowych można uzyskać za pomocą %n gdzie n jest liczbą zmiennych początkowych ( %1 dla pierwszego, %2 dla drugiego. Ta metoda %n działa dla% 1 -% 9. Dla parametru 10 - 255 potrzebujesz aby użyć polecenia Shift ).
Na przykład:

:function <var1> <var2>

Po użyciu call :function param1 param2 , dostęp do param1 można uzyskać za pomocą %1 , a param2 pomocą %2 .
Uwaga: <parameter> nie jest absolutnie konieczny, ale pomaga w czytelności.

Ciekawą sztuczką, która jest przydatna, gdy wiele zmiennych lata, jest użycie setlocal i endlocal w parze z %n . setlocal i endlocal zasadniczo sprawiają, że funkcja jest oddzielną instancją wiersza polecenia, a ustawione w nim zmienne endlocal tylko w ramce.

Jeśli używasz setlocal i endlocal i endlocal wartości globalne, użyj tego.

endlocal & set var=variable

To ustawia globalną wartość var na variable . Możesz połączyć je razem dla wielu zmiennych.

endlocal & set var=variable & set var2=variable number 2

To ustawia zmienną globalną var na variable a wartość globalną var2 na variable number 2 .
Ponieważ kod w blokach kodu jest wykonywany jednocześnie, możesz to również zrobić.

if "%var%"=="" (
    endlocal
    set %~2=10
)

Ale nie możesz tego zrobić.

if "%var%"=="" (
    set %~2=10
    endlocal
)

Prosta funkcja

call :FunctionX
rem More code...

:FunctionX
rem Some code here.
goto :eof

To bardzo prosta funkcja. Funkcje to polecenia wewnątrz programu, które wykonują wiele poleceń jednocześnie. Funkcje są tworzone przez tworzenie etykiety i umieszczanie w niej kodu, a po zakończeniu dodaje się goto :eof lub exit /b <ErrorlevelYou'dLike> który powraca do miejsca, w którym został wywołany. Funkcje wywoływane są za pomocą call :functionname adparams .

Funkcja z parametrami

call :tohex 14 result
rem More code...

:tohex <innum> <outvar>
set dec=%1
set outvar=%~2
rem %n and %~n are functionally identical, but %~n is slightly safer.
goto :eof

To pobiera dodatkowe parametry z call tak jakby funkcja była osobnym plikiem wsadowym.
Uwaga: <parameter> nie jest konieczny, ale pomaga w czytelności.

Funkcja wykorzystująca setlocal i endlocal

set var1=123456789
set var2=abcdef
call :specialvars
echo %var1%, %var2%
rem More code...

:specialvars
setlocal
set var1=987654321
set var2=fedcba
endlocal
goto :eof

Wewnątrz sekcji setlocal , endlocal , zmienne są oddzielone od zmiennych obiektu wywołującego, dlatego też zmienne% var1% i% var2% nie zostały zmienione.

Łącząc je wszystkie

set importantvar=importantstuff
call :stuff 123 var1
rem More code...

:stuff <arg1> <arg2>
setlocal
set importantvar=%~1
echo Writing some stuff into %~2!
endlocal
set %~2=some stuff
setlocal
set importantvar=junk
endlocal
goto :eof

Wykorzystuje podstawową funkcję, setlocal i endlocal oraz argumenty, aby stworzyć dziwną małą funkcję.

Anonimowe funkcje w plikach wsadowych

Technika funkcji anonimowych wykorzystuje fakt, że polecenie CALL używa wewnętrznie GOTO gdy wywoływany jest podprogram, i nadużywa drukowania wiadomości pomocy ze zmiennym podwójnym rozwinięciem :

@echo off
setlocal 
set "anonymous=/?"

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

if "%0" == ":%anonymous%" (
  echo(
  echo Anonymous call:
  echo %%1=%1 %%2=%2 %%3=%3
  exit /b 0
)>&3

Możesz wywołać funkcję anonimową tylko wtedy, gdy jest ona zdefiniowana po CALL (lub po zakończeniu kontekstu w nawiasach, jeśli CALL jest wykonywany w nawiasach). Nie można go wywołać ze skryptu zewnętrznego , ale jest wolniejszy niż normalne wywołanie funkcji.

Wywoływanie funkcji z innego pliku wsadowego

Pozwala mieć następujący plik o nazwie library.cmd :

@echo off

echo -/-/- Batch Functions Library -/-/-

:function1
    echo argument1 - %1
    goto :eof

Aby wykonać tylko : function1 bez kodu reszty pliku, należy umieścić etykietę : function1 w nietoperze wywołującym i użyć go w następujący sposób:

@echo off

call :function1 ###
exit /b %errorlevel%

:function1
    library.bat %*

wyjście będzie (kod poza funkcją w library.cmd nie jest wykonywany):

argument1 - ###

Aby uzyskać więcej informacji, sprawdź to .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow