ss64 script leq geq equ batch bat batch-file for-loop

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:

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.