L'obiettivo di una CHIAMATA o GOTO non deve mai essere all'interno di un'istruzione di blocco tra parentesi. Può essere fatto, ma come vedi, i risultati probabilmente non saranno ciò che desideri.
L'intero costrutto IF (...) ELSE (...) viene analizzato e caricato in memoria prima che venga elaborato. In altre parole, è logicamente trattato come una riga di codice. Dopo che è stato analizzato, CMD.EXE è in attesa di riprendere l'analisi a partire dalla riga successiva dopo il costrutto IF/ELSE.
Dopo la fase di analisi, il comando complesso viene eseguito dalla memoria. La clausola IF viene elaborata correttamente e la clausola ELSE viene saltata correttamente. MA all'interno della clausola IF (true), si esegue un GOTO :asdf
, quindi CMD.EXE inizia a eseguire la scansione dell'etichetta. Inizia alla fine dell'IF/ELSE e scansiona fino alla fine del file, torna all'inizio e esegue la scansione finché non trova l'etichetta. L'etichetta si trova all'interno della tua clausola IF, ma lo scanner etichetta non sa nulla di quel dettaglio. Pertanto, quando il comando complesso termina l'esecuzione dalla memoria, l'elaborazione batch riprende dall'etichetta anziché dalla fine del complesso IF/ELSE.
Quindi a questo punto il processore batch vede ed esegue le prossime righe
echo baz
) else (
echo quux
)
Baz fa eco, e così è quux. Ma si potrebbe chiedere: "Perché non lo fa ) else (
e/o )
generare un errore di sintassi poiché sono ormai sbilanciato e non è più analizzato come parte della più ampia istruzione IF?
Questo è causa di come è gestita )
.
Se v'è un open (
attivo quando si incontra )
, poi il )
viene elaborato come ci si aspetterebbe.
Ma se il parser si aspetta un comando e trova un )
quando non v'è un attivo aperto (
, quindi lo )
viene ignorato e tutti i caratteri sul resto della riga vengono ignorati! In effetti il )
ora funziona come una dichiarazione REM.
+1 Buona spiegazione, Dave. Uno più corto è: quando viene eseguito 'GOTO' qualsiasi comando * attivo *' FOR/IF' viene annullato e il file Batch continua dall'etichetta. – Aacini