batch-file
функции
Поиск…
замечания
Вы можете добавить стартовые переменные к функции, добавив <parameter>
к ее метке. Доступ к этим стартовым переменным можно получить с помощью %n
где n - номер начальной переменной ( %1
для первого, %2
для второго. Этот метод %n
работает для% 1 -% 9. Для параметра 10 - 255 вам понадобится для использования команды Shift ).
Например:
:function <var1> <var2>
Как только вы используете call :function param1 param2
, param1
может быть доступен с помощью %1
и param2
с %2
.
Примечание. <parameter>
не является строго необходимым, но он помогает с удобочитаемостью.
Оптимальный трюк, полезный, когда много переменных летает, - использовать setlocal
и endlocal
в тандеме с %n
. setlocal
и endlocal
существенно делают функцию ее собственным отдельным экземпляром командной строки, переменные, установленные в ней, только придерживаются, пока она находится в кадре.
Если вы используете setlocal
и endlocal
, и вы возвращаете глобальные значения, используйте это.
endlocal & set var=variable
Это устанавливает глобальное значение var
в variable
. Вы можете связать их вместе для нескольких переменных.
endlocal & set var=variable & set var2=variable number 2
Это задает глобальную переменную var
variable
и глобальное значение var2
variable number 2
.
Так как код в блоках кода также выполняется одновременно, вы также можете это сделать.
if "%var%"=="" (
endlocal
set %~2=10
)
Но вы не можете этого сделать.
if "%var%"=="" (
set %~2=10
endlocal
)
Простая функция
call :FunctionX
rem More code...
:FunctionX
rem Some code here.
goto :eof
Это очень простая функция. Функции - это программные команды, которые выполняют несколько команд за раз. Функции создаются путем создания метки и помещения кода в нее, и после ее завершения вы добавляете goto :eof
или exit /b <ErrorlevelYou'dLike>
который возвращается туда, где он был вызван. Функции вызываются с call :functionname adparams
.
Функция с параметрами
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
Это требует дополнительных параметров от call
как если бы функция была отдельным Batch-файлом.
Примечание: <parameter>
не нужен, но он помогает с удобочитаемостью.
Функция Использование setlocal и 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
Когда внутри секции setlocal
, endlocal
раздел переменные отдельно от переменных вызывающего, поэтому почему% var1% и% var2% не были изменены.
Объединяя их все
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
Это использует основную функцию, setlocal
и endlocal
и аргументы для создания нечетной маленькой функции.
Анонимные функции в пакетных файлах
Метод анонимных функций использует тот факт, что команда CALL
использует внутренне GOTO
при вызове подпрограммы и злоупотреблении служебной печатью сообщения с переменным двойным расширением :
@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
Вы можете вызвать анонимную функцию только в том случае, если она определена после CALL
(или после завершения контекста скобок, если CALL
выполняется в скобках). Он не может быть вызван из внешнего скрипта , но является более медленным, чем обычный вызов функции.
Вызов функций из другого пакетного файла
Позволяет иметь следующий файл с именем library.cmd :
@echo off
echo -/-/- Batch Functions Library -/-/-
:function1
echo argument1 - %1
goto :eof
Чтобы выполнить только : function1 без кода остальной части файла, вы должны поместить метку : function1 в биту вызывающего абонента и использовать ее так:
@echo off
call :function1 ###
exit /b %errorlevel%
:function1
library.bat %*
вывод будет (код вне функции в library.cmd
не выполняется):
argument1 - ###
Для получения дополнительной информации проверьте это .