batch-file
Funkcje
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 .