2016-05-29 38 views
13

Sto cercando di capire in che punto del codice si trova esattamente GOTO :EOF?Dove si trova GOTO: EOF?

Ecco il codice:

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 

risposta

25

:EOF è un'etichetta predefinita come spiega Microsoft nella documentazione per il comando GOTO. L'output della guida eseguito in una finestra del prompt dei comandi goto /? spiega anche questa etichetta speciale per Fine del file. Ma questa etichetta predefinita è supportata solo con le estensioni dei comandi abilitate come predefinite.

L'uscita aiuto in esecuzione in una finestra di prompt dei comandi call /? e, naturalmente, anche la documentazione per il comando CALL spiegare sia che goto :EOF dovrebbe essere usato per uscire da una subroutine chiamato con call :Label.

Una subroutine non è altro che un altro file batch incorporato nel file batch corrente chiamato con il comando call. Se la subroutine si trova alla fine del file batch, la fine reale del file segna la fine della subroutine.

Ma ci possono essere più subroutine in un file batch.

Quindi un comando è necessario per l'interprete dei comandi per uscire dalla subroutine al raggiungimento di una riga specifica nell'elaborazione dei comandi e tornare al processo del comando chiamante. goto :EOF e exit /B possono essere utilizzati ovunque per uscire da una subroutine o uscire dall'elaborazione batch corrente.

Nel codice del lotto in questione, la prima goto :EOF è necessario per uscita file batch trasformazione senza una caduta indesiderata attraverso il codice subroutine dopo aver terminato il ciclo.

Il secondagoto :EOF discontinuo codice di interrogante è per uscire la subroutine e proseguire l'elaborazione in PER loop nella seconda riga. Non esce dall'elaborazione del file batch, esce solo dalla subroutine.

Nota 1:goto EOF senza i due punti è necessario che ci sia davvero una riga che inizia con :EOF nel file batch, vale a dire l'etichetta di salto EOF deve esistere nel file. goto :EOF risulta sempre in uscita dall'elaborazione di subroutine/batch con estensioni di comando abilitate anche se esiste un'etichetta EOF nel file batch a causa di una riga che inizia con :EOF.

Nota 2: Comando EXIT senza parametro /B risultati sempre uscire tutta l'elaborazione del comando indipendente a chiamare gerarchia e indipendente come il comando interpeter è stato avviato con il parametro /K (tenere aperto ed usati quando si apre una finestra del prompt dei comandi) o con /C (chiudi dopo l'elaborazione del comando terminato come utilizzato facendo doppio clic su un file batch). Pertanto, exit senza /B deve essere utilizzato saggiamente in un file batch (il migliore: mai).

Nota 3:exit /B non funziona con le estensioni comando disattivato come dimostrato da questo codice:

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

L'esecuzione di questo file batch all'interno di un prompt dei comandi risultati delle finestre in uscita del messaggio di errore:

il sistema non riesce a trovare l'etichetta batch specificato - EOF

In altre parole, exit /B è esattamente come goto :EOF e dipende quindi anche dalle estensioni dei comandi. exit senza /B funziona sempre.

Nota 4:ERRORLEVEL non è influenzato dal goto :EOF, ma la documentazione di Microsoft GOTO è muta su questo argomento. exit /B # imposta ERRORLEVEL a #as documented di Microsoft. Tuttavia, non è in genere necessario uscire esplicitamente da un file batch con un codice di uscita specifico poiché né goto :EOFexit /B modificano il valore corrente di ERRORLEVEL.

Per i dettagli sul comportamento ERRORLEVEL vedere:

+0

Ho capito grazie mille! – s6398197atuser

+1

Il testo della guida che appare quando si digita 'cmd /?' Elenca tutti i comandi che sono effettuati dalle estensioni dei comandi, ma 'exit' è * non * menzionato; grazie per averlo indicato! – aschipfl

0

: EOF significa "Fine del file". È usato per terminare lo script senza eseguire nessuno dei comandi seguenti.

+0

grazie! ma come avviene allora il ciclo? il 2 ° GOTO dice anche: eof non doveva dire GOTO: DO per esempio? – s6398197atuser

+3

@ s6398197atuser 'call' genera un thread figlio e l'esecuzione delle pause del thread corrente fino al termine di' call'. 'call: subroutine' viene eseguito finché non viene raggiunto il suo' exit/b' o EOF, momento in cui l'esecuzione riprende dal chiamante. Lasciate l'eco e potete osservare l'ordine in cui vengono eseguiti i comandi, e si spera che abbia un po 'più senso. [Vedi questa pagina] (http://ss64.com/nt/call.html) per maggiori informazioni su 'call', e [this page] (http://www.dostips.com/DtTutoFunctions.php) per un tutorial sulle funzioni di script batch. – rojo

+0

@ Micho, grazie mille, penso di averlo capito! – s6398197atuser

5

GOTO :EOF è funzionalmente equivalente a exit /B, ma entrambi i moduli funzionano solo quando le estensioni sono abilitate. La prova per questo punto è molto semplice:

setlocal DisableExtensions 
goto :EOF 

Paragonare Codice precedente contro questo:

setlocal DisableExtensions 
exit /B 

Ciò significa che GOTO :EOF ritorna stesso punto in cuiexit /B sarebbero tornati.