goto - Saltar a una etiqueta
Al crear archivos por lotes, a menudo se quiere omitir una parte del proceso cuando se cumple una condición, o saltar a un tratamiento de errores cuando algo falla.
El comando goto permite controlar el flujo de esta manera.
Este artículo explica el comando goto, desde lo básico hasta las subrutinas, con código de ejemplo.
Sintaxis básica de goto
El comando goto salta a la posición de la etiqueta indicada.
GOTO nombre_de_etiqueta
Una etiqueta se define como una línea que empieza con dos puntos :.
:nombre_de_etiqueta
Ejemplo básico
@echo off
setlocal
echo Ejecutando el paso 1.
GOTO SKIP
echo Esta línea se omite.
:SKIP
echo Ejecutando el paso 2.
endlocal
GOTO SKIP salta a la etiqueta :SKIP, por lo que el echo intermedio no se ejecuta.
Los nombres de etiqueta no distinguen entre mayúsculas y minúsculas. :SKIP, :skip y :Skip se tratan como la misma etiqueta.
Combinar goto con condiciones
El comando goto suele combinarse con el comando if para cambiar el flujo según una condición.
@echo off
setlocal
copy "important.txt" "backup\important.txt" >nul 2>&1
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
echo La copia de seguridad se completó.
GOTO END
:ERROR
echo Error: la copia de seguridad falló.
:END
endlocal

中小企業経営者のためのRPA入門 RPA導入を成功させる方法

60分でわかる! AIエージェント 超 入門

コマンドラインの黒い画面が怖いんです。

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門
Si la copia falla, se salta a :ERROR; si tiene éxito, se salta a :END.
Terminar un archivo por lotes con GOTO :EOF
GOTO :EOF salta al final del archivo por lotes y termina su ejecución.
@echo off
setlocal
IF NOT EXIST "config.ini" (
echo Error: no se encontró config.ini.
GOTO :EOF
)
echo Se cargó el archivo de configuración.
rem Procesamiento posterior...
endlocal
:EOF es una etiqueta especial que no hace falta definir. Está disponible cuando las extensiones de comandos están habilitadas (el valor predeterminado de Windows).
Implementar un menú
Con goto se puede crear un menú que ejecuta distintos procesos según la elección del usuario.
@echo off
setlocal
:MENU
echo.
echo ========== Menú ==========
echo 1. Mostrar archivos
echo 2. Mostrar uso del disco
echo 3. Salir
echo ==========================
set "CHOICE="
set /p CHOICE=Introduce un número:
IF "%CHOICE%"=="1" GOTO LIST
IF "%CHOICE%"=="2" GOTO DISK
IF "%CHOICE%"=="3" GOTO END
echo Entrada no válida.
GOTO MENU
:LIST
dir /b
GOTO MENU
:DISK
powershell -NoProfile -Command "Get-PSDrive -PSProvider FileSystem"
GOTO MENU
:END
echo Saliendo del programa.
endlocal
El menú se muestra repetidamente hasta que el usuario introduce “3”.
Si el usuario solo pulsa Intro, set /p no modifica la variable y se conserva el valor anterior. Por eso la variable se vacía con set "CHOICE=" antes de la entrada.
wmic se usaba habitualmente para obtener información de discos, pero está obsoleto y ya no se instala de forma predeterminada en las versiones recientes de Windows 11. Este ejemplo usa PowerShell.
Usarlo como subrutina (CALL :etiqueta)
goto no vuelve tras saltar, pero CALL :etiqueta ejecuta una etiqueta como subrutina (similar a una función) y regresa a la posición original después.
@echo off
setlocal
echo Iniciando el proceso principal.
CALL :GREET "Taro"
CALL :GREET "Hanako"
echo Proceso principal finalizado.
GOTO :EOF
:GREET
echo Hola, %~1.
EXIT /B
Una subrutina debe terminar con EXIT /B o GOTO :EOF. De lo contrario, la ejecución continúa por las subrutinas e instrucciones siguientes.
Implementar un bucle con goto
Se puede escribir un bucle con contador usando solo una etiqueta y goto, sin el comando for.
@echo off
setlocal
set /a COUNT=1
:LOOP
IF %COUNT% GTR 3 GOTO :EOF
echo Iteración %COUNT%.
set /a COUNT+=1
GOTO LOOP
Errores habituales y soluciones
«El sistema no encuentra la etiqueta de lote especificada»
Este mensaje aparece cuando la etiqueta indicada en GOTO no existe en el archivo por lotes. Comprueba lo siguiente:
- El nombre de la etiqueta está escrito igual en ambos sitios (en
GOTOno se escriben los dos puntos; solo en la definición) - La línea de la etiqueta empieza con dos puntos
- La etiqueta de destino está definida fuera, y no dentro, de un bloque entre paréntesis
( )
Precauciones al usar goto
Evita el uso excesivo
Abusar de goto complica el flujo y produce el llamado «código espagueti». Siempre que sea posible, considera sustituirlo por if/else o por subrutinas con CALL :etiqueta.
Cuidado dentro de bucles
Usar goto dentro de un bucle for o de un bloque entre paréntesis ( ) interrumpe ese bucle o bloque. Si necesitas ramificar dentro de un bucle, usa una instrucción if.
Resumen
Este artículo explicó cómo usar el comando goto.
| Finalidad | Sintaxis |
|---|---|
| Saltar a una etiqueta | GOTO etiqueta |
| Terminar el archivo | GOTO :EOF |
| Llamar a una subrutina | CALL :etiqueta |
| Volver de una subrutina | EXIT /B |