Zweck:Ausführen eines Unterprogramms in der aktuellen Batch-Datei

 

Format:GOSUB ["filename"] label [variables]

 

filenameDie Datei, die das Unterprogramm enthält
labelDas Label der Batchdatei am Anfang des Unterprogramms.
variablesOptionale GOSUB-Variablen.

 

Siehe auch: CALL, GOTO, und RETURN.

 

Syntax der Dateivervollständigung:

 

Die Standard-Syntax für die Vervollständigung von Dateinamen lautet: [1] dirs btm cmd bat [2*] *

 

Verwendung:

 

GOSUB kann nur in Batch-Dateien verwendet werden.

 

TCC erlaubt Unterprogramme in Batchdateien. Ein Unterprogramm muss mit einem Label (einem Doppelpunkt [:] gefolgt von einem Labelnamen)  beginnen , das in einer eigenen Zeile steht und nicht in einer Befehlsgruppe enthalten sein darf . Groß- und Kleinschreibung werden beim Abgleich von Bezeichnungen ignoriert. Das Unterprogramm muss mit einer  RETURN-Anweisung enden.

 

Das Unterprogramm wird mit einem GOSUB-Befehl aus einem anderen Teil der Stapeldatei aufgerufen. Nach dem RETURN wird die Verarbeitung mit dem auf den GOSUB-Befehl folgenden Befehl fortgesetzt. Das folgende Batch-Dateifragment ruft zum Beispiel ein Unterprogramm auf, das das Verzeichnis anzeigt und zurückkehrt:

 

echo Calling a subroutine

gosub subr1

echo Returned from the subroutine

quit

:subr1

dir /a/w

return

 

GOSUB beginnt mit der Suche nach dem Etikett in der Zeile der Batch-Datei unmittelbar nach dem GOSUB-Befehl. Wird das Label zwischen der aktuellen Position und dem Ende der Datei nicht gefunden, beginnt GOSUB die Suche erneut am Anfang der Datei. Wird das Etikett dann immer noch nicht gefunden, wird die Batch-Datei mit der Fehlermeldung "Etikett nicht gefunden" beendet.

 

Sie können dieVariablen vonGOSUB definieren, indem Sie sie nach dem Namen des Etiketts in der GOSUB-Zeile platzieren. Ein Beispiel:

 

Gosub Sub1 abc 15 "Hello World"

 

Die Variablennamen werden in der Label-Zeile definiert. Ein Beispiel:

 

:Sub1 [str n world]

 

definiert drei Variablen - %str (auf "abc" gesetzt), %n (auf 15 gesetzt) und %world (auf "Hello World" gesetzt). Beachten Sie, dass die eckigen Klammern in der Label-Zeile erforderlich sind. GOSUB-Variablen sind nur für die Dauer des Unterprogramms definiert. Sie werden nicht an verschachtelte GOSUBs vererbt und werden durch den  RETURN-Aufruf zerstört .

 

Wenn Sie ein * an den letzten Variablennamen in der Parameterliste in der Label-Zeile anhängen, wird dieser "gierig", und alle übrigen Variablen werden ihm zugewiesen. Ein Beispiel:

 

gosub sub1 one two three four five

...

:sub1 [arg1 arg2 arg3*]

 

arg3 wird "drei vier fünf" zugewiesen.

 

Wenn Sie GOSUB-Variablen auf dem Label definieren, sie aber nicht in der GOSUB-Zeile angeben, werden sie auf einen leeren String gesetzt.

 

GOSUB-Aufrufe mit Variablen sind auf eine maximale Tiefe von 22 Ebenen begrenzt. Für normale GOSUB-Aufrufe gibt es keine Begrenzung.

 

GOSUB-Variablen werden für die Dauer des Unterprogramms in einer speziellen Form in der Umgebung abgelegt und "maskieren" alle gleichnamigen Umgebungsvariablen, die vor dem Aufruf des Unterprogramms existierten. GOSUB-Variablen können wie normale Umgebungsvariablen referenziert werden, werden aber nicht auf dieselbe Weise gespeichert, können nicht mit den Befehlen SET, ESET oder UNSET geändert werden  und können nicht mit dem DEFINED-Test von IF, IFF oder @IF verwendet werden .

 

Sie können SET nicht  innerhalb eines Unterprogrammsverwenden , um den Wert einer GOSUB-Variablen zu ändern. Wenn Sie dies versuchen, setzt der SET-Befehl die gleichnamige Standard-Umgebungsvariable und nicht die GOSUB-Variable, aber dieser Wert wird durch die GOSUB-Variable "maskiert" und bleibt bis zum Ende des Unterprogramms unzugänglich.

 

Sie können ein Unterprogramm in einer anderen Datei aufrufen, indem Sie denDateinamenangeben (der Name muss in Anführungszeichen gesetzt werden). Auf diese Weise können Sie Bibliotheken von Unterprogrammen erstellen, ohne sie in jeder Batch-Datei duplizieren zu müssen. Zum Beispiel:

 

gosub "c:\library\batlib.btm" Evaluate [%1 %2 %3]

 

GOSUB speichert die IFF- und DO-Zustände, so dass IFF- und DO-Anweisungen innerhalb eines Unterprogramms nicht mit Anweisungen in dem Teil der Batch-Datei kollidieren, aus dem das Unterprogramm aufgerufen wurde. Wenn das Unterprogramm ein SETLOCAL ohne ein passendes ENDLOCAL ausgeführt hat, wird ein ENDLOCAL ausgeführt, bevor es zur aufrufenden Batchdatei zurückkehrt.

 

Sie können nicht  aus einem GOSUB zurückkehren, während Sie sich in einer DO-Schleife befinden.

 

Wenn TCC innerhalb eines Unterprogramms das Ende der Stapeldatei erreicht, kehrt es automatisch zu dem Befehl nach dem GOSUB zurück, so als ob ein expliziter  RETURN-Befehl in der letzten Zeile der Datei enthalten wäre.

 

Unterroutinen können verschachtelt werden.

 

Siehe auch: Benutzerdefinierte Funktionen.