Professional Documents
Culture Documents
Desde un fichero BAT podemos invocar la ejecución de otro fichero BAT (subrutina) de varias
formas:
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).
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 )
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.
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
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.
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
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:
: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.
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