batch file - script - ¿A dónde regresa GOTO: EOF?
ms dos batch goto (3)
:EOF
es una etiqueta predefinida como Microsoft explica en la documentación para el comando
GOTO
.
La salida de ayuda al ejecutarse en una ventana de símbolo del sistema
goto /?
explica también esta etiqueta especial para
Fin de archivo
.
Pero esta etiqueta predefinida solo es compatible con las extensiones de comando habilitadas de forma predeterminada.
La salida de ayuda se ejecuta en una ventana de símbolo del sistema
call /?
y, por supuesto, también la documentación para el comando
CALL
explica 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 la
call
comando.
Si la subrutina está al final del archivo por lotes, el final real del archivo marca el final de la subrutina.
Pero puede haber múltiples 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 regrese a la línea de comando de llamada.
goto :EOF
y
exit /B
se pueden usar en todas partes para salir de una subrutina o salir del procesamiento actual del archivo por lotes.
En el código de lote en cuestión, el
primer
goto :EOF
es necesario para
salir del procesamiento de archivos por lotes
sin una caída no deseada al código de subrutina después de finalizar el ciclo.
El
segundo
goto :EOF
en el código de lote del interrogador es para
salir de la subrutina
y continuar procesando en el bucle
FOR
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 resulta en salir del procesamiento de subrutina / lote con 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: El
comando
EXIT
sin parámetro
/B
siempre sale del proceso de comando completo independientemente de la jerarquía de llamadas e independiente de cómo se inició el procesador de comandos de Windows, con el parámetro
/K
para
mantener
cmd.exe
ejecutándose como se usa al abrir una ventana de símbolo del sistema con
/C
para
cerrar
después de que el procesamiento del comando haya terminado como se usa al hacer doble clic en un archivo por lotes.
Por lo tanto, la
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, por lo tanto, también depende 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
es muda sobre este tema.
exit /B #
establece
ERRORLEVEL
en
#
EXIT
por Microsoft.
exit /B #
también se puede usar 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 que llama a la subrutina como al usar los operadores
&&
o
||
o en el siguiente comando después de llamar a la línea de comando con
if errorlevel X
Sin embargo, no es necesario salir explícitamente de un archivo por lotes o una subrutina con un código de salida específico, ya que ni
goto :EOF
ni
exit /B
modifican el valor actual de
ERRORLEVEL
.
Para obtener detalles sobre el comportamiento de
ERRORLEVEL
, consulte:
- ¿Cuáles son los valores ERRORLEVEL establecidos por los comandos internos cmd.exe?
- ¿Qué comandos internos de cmd.exe borran el ERRORLEVEL a 0 en caso de éxito?
- Línea única con múltiples comandos usando el archivo por lotes de Windows
Estoy tratando de entender dónde exactamente en el código vuelve
GOTO :EOF
.
Aquí está el código:
SET count=1
FOR /f "tokens=*" %%G IN (somefile.txt) DO (call :subroutine "%%G")
GOTO :EOF
:subroutine
echo %count%:%1
set /a count+=1
GOTO :EOF
GOTO :EOF
es
funcionalmente equivalente
a
exit /B
, pero ambas formas 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 al
mismo punto
donde volvería la
exit /B
: eof significa " Fin de archivo ". Se utiliza para finalizar el script sin ejecutar ninguno de los comandos a continuación.