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 .