You are on page 1of 3

Subrutinas

Llamar a un fichero BAT desde otro fichero BAT

Desde un fichero BAT podemos invocar la ejecución de otro fichero BAT (subrutina) de varias
formas:

1: Llamada sin retorno: Escribiendo el nombre de otro archivo bat

En este caso el control se transfiere de un programa bat a otro, por finalizada la ejecución del
programa bat que realizó la llamada (es como un GOTO sin retorno).

Por ejemplo, con los siguientes archivos bat:

--- principal.bat --- rutina.bat


@echo off @echo off
echo INICIO PRINCIPAL echo ejecutando el subprograma ...
set x=PRINCIPAL echo variable x: %x%
rutina set x=SUBPROGRAMA
echo VARIABLE X: %x% echo variable x: %x%
echo FIN PRINCIPAL echo finalizando el subprograma

El resultado de la ejecución sería:

Z:\pruebas>principal
INICIO PRINCIPAL
ejecutando el subprograma ...
variable x: PRINCIPAL
variable x: SUBPROGRAMA
finalizando el subprograma

Z:\pruebas>set x
x=SUBPROGRAMA ( se han ejecutado en la misma shell )

2: Ejecución en subshell: se abre una subshell donde se ejecutará el subprograma: cmd /c


progbat2

Al abrirse una nueva subshell, todas las variables de entorno que defina en la subrutina se
pierden al volver a la shell principal.
Cuando finaliza la subrutina, se continúa con la ejecución del programa principal.

En el programa "principal.bat", cambiamos la línea de llamada por:


cmd /c rutina

El resultado de la ejecución es:

Z:\pruebas>principal
INICIO PRINCIPAL
ejecutando el subprograma ...
variable x: PRINCIPAL <-- la subshell hereda las variables de entorno ...
variable x: SUBPROGRAMA
finalizando el subprograma
VARIABLE X: PRINCIPAL <-- las variables de la shell principal NO se ven

1 de 3
FIN PRINCIPAL afectadas por lo que hagamos en la subshell

3: Ejecución en la misma shell: Se utiliza el comando CALL progbat

Ejecuta la subrutina y el programa principal en la misma shell, por tanto las modificaciones
hechas en el entorno desde el subprograma, afectan al programa principal.
cuando finaliza la subrutina, continúa la ejecución en el progama principal.

Si en el programa principal anterior sustituimos la llamada por CALL rutina obtenemos:

Z:\pruebas>principal
INICIO PRINCIPAL
ejecutando el subprograma ...
variable x: PRINCIPAL
variable x: SUBPROGRAMA
finalizando el subprograma
VARIABLE X: SUBPROGRAMA <-- se han visto afectadas las variables de entorno
FIN PRINCIPAL del programa principal

PASO DE ARGUMENTOS AL SUBPROGRAMA

En cualquiera de los tres casos anteriores estamos ejecutando un programa bat, y por tanto
podemos pasarle parámetro posicionales.
Por ejemplo, la sintaxis general de la llamada con CALL sería de la forma:
CALL [pathTo]subprograma [arg1 arg2 ...]

Y aunque se ejecuten en la misma shell, los parámetros del subprograma (%1, %2, ...) son
independientes.

MEJORAS en el CALL
Llamar a una subrutina dentro del mismo archivo

Con CALL también podemos llamar a una etiqueta como si se tratara de una función o
subrutina:

CALL :nombre_subprograma [ arg1 arg2 ... ]


...

:nombre_subprograma
...
goto :eof

REM - por aquí puede haber más código que no pertenece al subprograma (e.g. otros subprograma

Todo se ejecuta en la misma shell, aunque los argumentos recibidos en los parámetros
posicionales %1, %2, no son compartidos entre la parte principal y la subrutina.

Las sentencias del subprograma se ejecutan secuencialmente hasta llegar al final del archivo,
por lo que puede hacerse necesaria la instrucción goto :eof , que continúa la ejecución al final
del archivo (end of file). Podríamos poner también la la típica goto FIN, siendo la etiqueta
:FIN la última línea del programa. O incluso EXIT /B nº , si necesitamos devolver un código

2 de 3
de retorno (errorlevel).
En la subrutina sólo será necesaria si hubiera código debajo de ésta.

El siguiente ejemplo es una demostración de cómo podría convertirse a mayúsculas la entrada


del usuario con una subrutina:

Z:\pruebas>type mayuscular.bat
@echo off
set /P x="Dime algo: "
call :toUpperCase %x%
echo [ %x% ]
exit /b

:toUpperCase
set x=%*
set x=%x:a=A% <-- sustituimos todas las 'a' minúscula por 'A' mayúscula
set x=%x:b=B% <-- ...
set x=%x:c=C%
set x=%x:d=D%
set x=%x:e=E%
set x=%x:f=F%
set x=%x:g=G%
set x=%x:h=H%
set x=%x:i=I%

3 de 3

You might also like