¿A dónde regresa GOTO: EOF?

Estoy tratando de entender en qué parte del código exactamente 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 

:EOF es una etiqueta predefinida como explica Microsoft en la documentación del comando GOTO . La salida de ayuda se ejecuta en una ventana del símbolo del sistema goto /? también explica esta etiqueta especial para End Of File . Pero esta etiqueta predefinida solo se admite con extensiones de comando habilitadas como predeterminadas.

La salida de ayuda se ejecuta en una ventana de símbolo del sistema call /? y por supuesto también la documentación del 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 una 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 del comando y regrese a la línea de comando de la llamada. goto :EOF como exit /B se pueden usar en cualquier lugar para salir de una subrutina o salir del procesamiento actual del archivo por lotes.

En el código de lote en cuestión, se necesita el primer goto :EOF para salir del procesamiento del archivo por lotes sin una caída no deseada al código de subrutina después de terminar el ciclo.

El segundo goto :EOF en el código de cuestionario del lote es para salir de la subrutina y continuar procesando en el ciclo 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 exista 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 proceso 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: Comando EXIT sin parámetro /B resultados siempre al salir del proceso de comando completo independiente 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 ejecutar cmd.exe como se usa al abrir una ventana del símbolo del sistema o con /C para cerrar después de que el procesamiento del comando haya terminado como se utilizó 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 desactivadas como lo demuestra este código:

 @echo off setlocal DisableExtensions echo Use command exit /B with command extensions disabled. exit /B 

Ejecutar este archivo por lotes desde una ventana de símbolo del sistema da como resultado el resultado del mensaje de error:

El sistema no puede encontrar la etiqueta del lote especificada – EOF

En otras palabras exit /B sin un código de salida adicional es exactamente como goto :EOF y depende por lo 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á silenciada en este tema. exit /B # establece ERRORLEVEL en # según lo documentado 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 comandos que llama a la subrutina, al igual que al usar los operadores && o || o en el próximo 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 ni goto :EOF ni exit /B modifican el valor actual de ERRORLEVEL .

Para detalles sobre el comportamiento ERRORLEVEL ver:

  • ¿Cuáles son los valores de ERRORLEVEL establecidos por los comandos internos de cmd.exe?
  • ¿Qué comandos internos de cmd.exe borran el ERRORLEVEL a 0 cuando tiene éxito?
  • Una sola línea con múltiples comandos usando el archivo por lotes de Windows

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 vs. este:

 setlocal DisableExtensions exit /B 

Esto significa que GOTO :EOF vuelve al mismo punto donde volvería la exit /B

: eof significa ” Fin del archivo “. Se utiliza para finalizar el script sin ejecutar ninguno de los comandos a continuación.