batch-file
Funciones
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 .