fritzo
Goto Top

HowTo - Wie man Subroutinen in Batchfiles erstellt

Anfängerkompatibles Batch-Tutorial

Hallo,

ich möchte Euch anhand dieses kleinen Tuts zeigen, wie man Subroutinen innerhalb eines Batchfiles realisieren kann. Die meisten gehen davon aus, daß dies nicht möglich ist, aber es funktioniert - und das sogar sehr gut.

Also; fangen wir einfach an. Schauen wir uns das kleine Shellscript hier einmal genau an und versuchen, zu interpretieren, was es macht. Ich habe die Zeilen numeriert, damit wir alles schnell wiederfinden:

1  @echo off
2 
3  :main
4  @echo here main
5  call :sub1
6  call :sub2
7  goto :end
8 
9  :sub1
10 @echo here sub1
11 goto :eof
12 
13 :sub2
14 @echo here sub2
15 goto :eof
16 
17 :end

Wie gesagt, ein sehr kleines Listing, aber sehr nützlich, da wir das als Gerüst für weitere Scripts verwenden können. Nehmen wir das Script mal auseinander, und zwar genau in der Reihenfolge, in der es auch abläuft:

Zeile 1: @echo off
Dies schaltet die Befehlsausgabe für dieses Script ab. Das dient dazu, den Output des Scripts zu gliedern, damit es nur das ausgibt, was wir ausgeben wollen - der Output sieht sonst fransig und häßlich aus.

Zeile 2:
Hier passiert nüscht, weil dies einfach nur zur Aufteilung des Scripts dient - das CLI interpretiert Leerzeichen (oder auch "Spaces") nicht, sondern übergeht sie einfach. Deswegen könnt Ihr das Script auch nach Lust und Laune mit Spaces oder auch Tabs formatieren, damit es einfacher lesbar ist. Ich rücke zB "if"-Schleifen mit dem Tabulator ein, damit erkennbar ist, wo Anfang und Ende sind.

Zeile 3 :main
Dieses ist eine sogenannte Sprungmarke. Sie besteht aus einem Doppelpunkt und einem Namen für die Sprungmarke. Der Doppelpunkt, der das Gebilde für den Command Line Interpreter (CLI) als Sprungmarke definiert, teilt diesem auf, Deutsch übersetzt, folgendes mit: "Achtung, CLI - das nächste, was kommt, ist kein Befehl und keine Variable, sondern eine Sprungmarke!".

In fast allen bekannten Hochsprachen gibt es eine Hauptroutine und Subroutinen. Die Hauptroutine ("main") ist das eigentlich ablaufende Programm; dieses ruft seinerseits die Subroutinen (auch: "Unterroutinen" oder Prozeduren) auf. Gäbe es sie nicht, dann wäre der Sourcecode (also das geschriebene Programm) nicht unterteilt und wir müßten das Programmlisting von Anfang bis Ende lesen, um überhaupt mitzukriegen, was da vor sich geht.

Verwende ich hingegen Subroutinen, so suche ich mir einfach die Hauptroutine ("main") und schaue dort nach, wann welche Subroutine aufgerufen wird. Will ich wissen, was in der Subroutine steht, dann suche ich mir diese einfach und schaue wiederum nach. Ein weiteres Gebilde sind die sogenannten Funktionen, die ähnlich wie Subroutinen funktionieren, aber einen Wert entgegennehmen und einen anderen zurückgeben können - sie dienen z.B. dazu, Berechnungen anzustellen - ich übergebe zwei oder mehrere Werte, diese werden berechnet und ich erhalte das berechnete Ergebnis zurück.

Zeile 4 @echo here main
Diese Zeile habe ich eingefügt, damit wir wissen, wann wir nach Programmstart in der Hauptroutine "main" sind. Sozusagen ein simples "Hello, World!" für Subroutinen.

Zeile 5 call :sub1
So, jetzt wird es interessant. In dieser Zeile wird nämlich die erste Subroutine angesprungen, und zwar mit dem Befehl "call". Dieser Befehl bedeutet, daß wir nach Ausführung der Subroutine zurückkehren wollen. Das Gegenstück dazu ist "goto" - dieser Befehl würde auch zur angegebenen Marke springen, danach aber nicht mehr zurückkehren - und das ist nicht, was wir wollen. Also: "call :sub1", was übersetzt heißt: "Spring zur Sprungmarke :sub1 und kehre danach zurück". Und genau das tut das Programm jetzt, es springt und wir befinden uns jetzt nicht mehr in der Zeile 5, sondern in Zeile 9, wo die Marke ":sub1" definiert ist.

Zeile 9 :sub1
Wie oben beschrieben, sind wir von Zeile 6 mit dem Befehl "call" nach Zeile 9 gesprungen und befinden uns jetzt dort. Weiter geht's mit..

Zeile 10 @echo here sub1
Genau wie in Zeile 4 geben wir hier wieder einen kleinen Text aus, nur diesmal teilen wir mit, daß wir uns in der Subroutine "sub1" und nicht mehr in "main" befinden. "Springen ist fast wie wennste fliechst." ? nun ja, soooo aufregend ist es eigentlich nicht annähernd - es macht uns als angehenden Scriptgurus aber schon Spaß, wenn unser Programm so läuft, wie es laufen soll - und das tut es. Und es geht weiter im Programmablauf mit..

Zeile 11 goto :eof
Hier passiert etwas sehr interessantes. Normalerweise würden wir davon ausgehen, daß dieses "eof" übersetzt "end of file" heißt. Was es auch tut. Nur ist damit hier nicht das Ende des Programms gemeint, sondern das Ende der Subroutine. Sie endet hier und es wird nicht etwa das Programm beendet, sondern zurück gesprungen ? "back where we started from", nämlich wieder in die Hauptroutine "main". Für diejenigen, die z.B. Subroutinen aus Basic kennen - das entspricht einem "Return" - mit GOSUB wird in Basic eine Subroutine angesprungen, mit Return kehrt man an den Ort des eigentlichen Geschehens zurück.

Zeile 6 call :sub2
Damit das Prinzip deutlich wird, habe ich das nochmals wiederholt: mit "call" springen wir wiederum in eine Subroutine, diesmal in "sub2", es folgt - genau!...

Zeile 13 :sub2
..was wiederum nur eine Sprungmarke ist - vergleiche Zeile 5. Dann wird in..

Zeile 14 @echo here sub2
wieder ein hübscher kleiner Text ausgegeben und mit..

Zeile 15 goto :eof
..wieder zurückgesprungen. Wir befinden uns jetzt wieder im Hauptprogramm "main" und dort wird dann weitergemacht mit..

Zeile 7 goto :end
Diesmal wollen wir nicht hin und her springen, sondern nur noch hin und dann beenden, deswegen verwenden wir hier kein "call", sondern ein simples "goto", welches dem Parser sagt:" Gehe hin und mehre Dich..." äh nein, das war es nicht, sondern "Gehe hin und spring zur Sprungmarke ":end" und kehre nicht zurück!" Was das CLI auch macht; es springt und landet in..

Zeile 17 :end
..welche nichts anderes ist als eine weitere Sprungmarke.

Nach Zeile 17 folgt nichts mehr außer schwarzer Leere und außerdem der Übergabe der Befehlsgewalt vom Script an das CLI, aus diesem Grund endet hier das Programm und wir sind fertig mit dem Script und leider auch schon diesem kleinen Exkurs in die Welt der Shellscripts. Ich hoffe, Ihr nehmt ein bißchen an Info mit und kriegt durch das Tut ein bißchen Lust, mit Shellbefehlen herumzuprobieren!

Grüße,
Arne (fritzo)

Content-Key: 10752

Url: https://administrator.de/contentid/10752

Printed on: April 18, 2024 at 04:04 o'clock

Member: Atti58
Atti58 May 17, 2005 at 06:25:32 (UTC)
Goto Top
Super Posting!!!

Man lernt halt nie aus face-wink,

Gruß

Atti
Member: meinereiner
meinereiner May 26, 2005 at 21:02:57 (UTC)
Goto Top
da kann mich mich Atti nur anschliessen.
Aber der Untertitel "Level: Absolut Beginner" find ich schon etwas frustrierend.....
Member: fritzo
fritzo May 27, 2005 at 00:20:31 (UTC)
Goto Top
da kann mich mich Atti nur anschliessen.
Aber der Untertitel "Level: Absolut
Beginner" find ich schon etwas
frustrierend.....


Damit war eigentlich gemeint, daß auch Anfänger damit zurecht kommen sollten; ich habe es bewußt so geschrieben. Ich hab's jetzt geändert in "Anfängerkompatibles Batch-Tutorial". Besser?

Grüße,
fritzo