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 - ###
Для получения дополнительной информации проверьте это .