Buscar..


Observaciones

Puede agregar variables de inicio a la función agregando <parameter> a su etiqueta. Se puede acceder a estas variables iniciales con %n donde n es el número de la variable inicial ( %1 para el primero, %2 para el segundo. Este método %n funciona para% 1 -% 9. Para el parámetro 10 - 255, necesitará para utilizar el comando Shift ).
Por ejemplo:

:function <var1> <var2>

Una vez que use call :function param1 param2 , se puede acceder a param1 con %1 , y param2 con %2 .
Nota: el <parameter> no es estrictamente necesario, pero ayuda con la legibilidad.

Un buen truco que es útil cuando hay muchas variables volando es usar setlocal y endlocal junto con %n . setlocal y endlocal esencialmente hacen que la función sea su propia instancia separada del símbolo del sistema, las variables establecidas solo endlocal en el marco.

Si está usando setlocal y endlocal , y está devolviendo valores globales, use esto.

endlocal & set var=variable

Esto establece el valor global var a variable . Puede encadenar estos juntos para múltiples variables.

endlocal & set var=variable & set var2=variable number 2

Esto establece la variable global var a variable y el valor global var2 a variable number 2 .
Dado que el código en bloques de códigos también se realiza simultáneamente, también puede hacerlo.

if "%var%"=="" (
    endlocal
    set %~2=10
)

Pero, no puedes hacer esto.

if "%var%"=="" (
    set %~2=10
    endlocal
)

Función simple

call :FunctionX
rem More code...

:FunctionX
rem Some code here.
goto :eof

Esta es una función muy simple. Las funciones son comandos en el programa que realizan varios comandos a la vez. Las funciones se crean creando una etiqueta y colocando un código en ella, y una vez que se hace, se agrega goto :eof o exit /b <ErrorlevelYou'dLike> que vuelve al lugar donde se invocó. Las funciones se invocan con call :functionname adparams .

Función con parámetros

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

Esto toma los parámetros adicionales de la call como si la función fuera un archivo por lotes separado.
Nota: el <parameter> no es necesario, pero ayuda con la legibilidad.

Función que utiliza setlocal y 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

Cuando se encuentran dentro de la sección setlocal , endlocal section, las variables se separan de las variables de la persona que llama, por lo tanto, por qué% var1% y% var2% no se cambiaron.

Combinándolos a todos

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

Esto utiliza la función básica, setlocal y endlocal y argumentos para crear una pequeña función extraña.

Funciones anónimas en archivos por lotes.

La técnica de funciones anónimas utiliza el hecho de que el comando CALL usa GOTO internamente cuando se llama a la subrutina y se abusa de la impresión de mensajes de ayuda con la expansión doble variable :

@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

Puede llamar a una función anónima solo si se define después del contexto de CALL (o después de terminar los paréntesis si la CALL se ejecuta entre paréntesis). No se puede llamar desde un script externo , pero es una llamada de función más lenta de lo normal.

Llamando funciones desde otro archivo por lotes

Permite tener el siguiente archivo llamado library.cmd :

@echo off

echo -/-/- Batch Functions Library -/-/-

:function1
    echo argument1 - %1
    goto :eof

Para ejecutar solo : function1 sin el código del resto del archivo, debe poner una etiqueta : function1 en el llamador y usarlo así:

@echo off

call :function1 ###
exit /b %errorlevel%

:function1
    library.bat %*

La salida será (el código fuera de la función en library.cmd no se ejecuta):

argumento1 - ###

Para más información verifique esto .



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow