Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

HowTo - Wie man Subroutinen in Batchfiles erstellt

Anleitung Entwicklung Batch & Shell

Mitglied: fritzo

fritzo (Level 2) - Jetzt verbinden

16.05.2005, aktualisiert 27.05.2005, 40521 Aufrufe, 3 Kommentare, 2 Danke

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:

01.
1  @echo off 
02.
2  
03.
3  :main 
04.
4  @echo here main 
05.
5  call :sub1 
06.
6  call :sub2 
07.
7  goto :end 
08.
8  
09.
9  :sub1 
10.
10 @echo here sub1 
11.
11 goto :eof 
12.
12  
13.
13 :sub2 
14.
14 @echo here sub2 
15.
15 goto :eof 
16.
16  
17.
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)
Mitglied: Atti58
17.05.2005 um 08:25 Uhr
Super Posting!!!

Man lernt halt nie aus ,

Gruß

Atti
Bitte warten ..
Mitglied: meinereiner
26.05.2005 um 23:02 Uhr
da kann mich mich Atti nur anschliessen.
Aber der Untertitel "Level: Absolut Beginner" find ich schon etwas frustrierend.....
Bitte warten ..
Mitglied: fritzo
27.05.2005 um 02:20 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Windows Server
gelöst Mein DNS erstellt keinen Hosteintrag für den Squid3 (3)

Frage von M.Marz zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 zeigt Übermittlungsfehler und erstellt mehrere PST-Dateien

Frage von thepatsch zum Thema Outlook & Mail ...

Exchange Server
gelöst Exchange - Postfach anlegen erstellt Mail mit "falschen Namen" (3)

Frage von Nuke.RJ zum Thema Exchange Server ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Microsoft
Ordner mit LW-Buchstaben versehen und benennen (19)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...