Поиск…


замечания

Вы можете добавить стартовые переменные к функции, добавив <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 - ###

Для получения дополнительной информации проверьте это .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow