Solución:
:EOF
es una etiqueta predefinida como explica Microsoft en la documentación del comando GOTO. La salida de ayuda ejecutándose en una ventana de símbolo del sistema goto /?
explica también esta etiqueta especial para Fin del documento. Pero esta etiqueta predefinida solo es compatible con las extensiones de comando habilitadas de forma predeterminada.
La salida de ayuda ejecutándose en una ventana de símbolo del sistema call /?
y, por supuesto, también la documentación para el comando CALL explica tanto que goto :EOF
debe usarse para salir de una subrutina llamada con call :Label
.
Una subrutina no es más que otro archivo por lotes incrustado dentro del archivo por lotes actual llamado con el comando call
. Si la subrutina está al final del archivo por lotes, el final real del archivo marca el final de la subrutina.
Pero puede haber varias subrutinas en un archivo por lotes.
Por lo tanto, se necesita un comando para que el intérprete de comandos salga de la subrutina al llegar a una línea específica en el procesamiento de comandos y vuelva a la línea de comando que llama. goto :EOF
al igual que exit /B
se pueden usar en todas partes para salir de una subrutina o salir del procesamiento de archivos por lotes actual.
En el código de lote en cuestión, el primero goto :EOF
es necesario para salir del archivo por lotes procesamiento sin una caída no deseada a través del código de subrutina después de terminar el ciclo.
los segundo goto :EOF
en el código de lote del interrogador es para salir de la subrutina y continuar procesando en POR bucle en la segunda línea. No sale del procesamiento del archivo por lotes, solo sale del procesamiento de la subrutina.
Nota 1: goto EOF
sin dos puntos requiere que realmente haya una línea que comience con :EOF
en el archivo por lotes, es decir, la etiqueta de salto EOF
debe existir en el archivo. goto :EOF
siempre da como resultado la salida del procesamiento por lotes / subrutinas con las extensiones de comando habilitadas incluso si hay una etiqueta EOF
en el archivo por lotes debido a una línea que comienza con :EOF
.
Nota 2: Comando SALIR sin parámetro /B
resulta siempre en salir de todo el proceso de comando independientemente de la jerarquía de llamadas e independiente de cómo se inició el procesador de comandos de Windows, con parámetro /K
para guardar cmd.exe
ejecutando como se usa al abrir una ventana del símbolo del sistema o con /C
para cerrar una vez finalizado el procesamiento del comando, como se usa al hacer doble clic en un archivo por lotes. Por lo tanto exit
sin /B
debe usarse con prudencia en un archivo por lotes (mejor: nunca).
Nota 3: exit /B
no funciona con las extensiones de comando deshabilitadas como lo demuestra este código:
@echo off
setlocal DisableExtensions
echo Use command exit /B with command extensions disabled.
exit /B
La ejecución de este archivo por lotes desde una ventana del símbolo del sistema da como resultado la salida del mensaje de error:
El sistema no puede encontrar la etiqueta de lote especificada – EOF
En otras palabras exit /B
sin un código de salida adicional es exactamente como goto :EOF
y depende, por tanto, también de las extensiones de comando. exit
sin /B
sin o con un código de salida funciona siempre.
Nota 4: ERRORLEVEL
no se ve afectado por goto :EOF
, pero la documentación de Microsoft GOTO está muda sobre este tema. exit /B #
conjuntos ERRORLEVEL
para #
según lo documentado por Microsoft. exit /B #
también se puede utilizar en lugar de goto :EOF
para salir de una subrutina con un código de salida específico evaluado en la línea de comando llamando a la subrutina como en el uso de los operadores &&
o ||
o en el siguiente comando después de llamar a la línea de comando con if errorlevel X
. Sin embargo, normalmente no es necesario salir explícitamente de un archivo por lotes o una subrutina con un código de salida específico, ya que tampoco goto :EOF
ni exit /B
modificar el valor actual de ERRORLEVEL
.
Para obtener detalles sobre ERRORLEVEL
comportamiento ver:
- ¿Cuáles son los valores de ERRORLEVEL establecidos por los comandos internos de cmd.exe?
- ¿Qué comandos internos de cmd.exe borran ERRORLEVEL a 0 después de tener éxito?
- Línea única con múltiples comandos usando archivo por lotes de Windows
GOTO :EOF
es funcionalmente equivalente para exit /B
, pero ambos formularios solo funcionan cuando las extensiones están habilitadas. La prueba para este punto es muy simple:
setlocal DisableExtensions
goto :EOF
Compare el código anterior con este:
setlocal DisableExtensions
exit /B
Esto significa que GOTO :EOF
vuelve a el mismo punto dónde exit /B
volvería.
: eof medio “Fin del documento“. Se utiliza para hacer que el script finalice sin ejecutar ninguno de los siguientes comandos.