Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: fritzo

fritzo (Level 2) - Jetzt verbinden

16.05.2005, aktualisiert 27.05.2005, 49563 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:

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 ..
Neue Wissensbeiträge
Administrator.de Feedback
Hinweise auf Dienstleister oder auf Suchmaschinen
Information von Frank vor 3 TagenAdministrator.de Feedback71 Kommentare

Lieber User, Admins und Moderatoren, aus gegebenen Anlass möchte ich zwei Dinge endgültig klarstellen und für die Nachwelt festhalten: ...

Router & Routing

PfSense 2.4 IPSec VPN mobile Clients Phase 2 wird plötzlich nicht mehr aufgebaut - So einfach war die Lösung

Tipp von the-buccaneer vor 3 TagenRouter & Routing9 Kommentare

Moinsen! Nachdem ich mir hierbei nen Wolf gesucht habe, möchte ich doch die Welt an dieser simplen Lösung teilhaben ...

Humor (lol)
Wählscheiben Telefon
Information von brammer vor 4 TagenHumor (lol)4 Kommentare

Hallo, Mal wirkliche eine nette Spielerei brammer

Sicherheit

Zeitenwende: Mehr pot. Mac- (Heise Wortlaut) als Windowsbedrohungen

Information von certifiedit.net vor 4 TagenSicherheit4 Kommentare

Wir hatten es ja hier erst letztens, dass OS bzw Mac auch nicht der Weisheit letzter Schluss ist, nun ...

Heiß diskutierte Inhalte
Netzwerke
Instagram Fake Account
Frage von NurangnNetzwerke18 Kommentare

Hey Leute, Ich bin neu hier und hätte eine Frage. Und zwar werden mein Freund und ich von Mehreren ...

Server-Hardware
Verkaufe mein HomeLab - Hat jemand Interesse?
Frage von BirdyBServer-Hardware13 Kommentare

Hallo miteinander, auf Grund eines bald bevorstehenden Umzugs, chronischer Nichtnutzung und des sehr eingeschränkten FAF (Frauen-Akzeptanz-Faktors) möchte ich mein ...

Erkennung und -Abwehr
Außenstehenden (Fremden) Remote Zugriff via VM erlauben
gelöst Frage von Cyphy98Erkennung und -Abwehr11 Kommentare

Moin Liebe Community Schlagt mich nicht falls ich was falsch mache, ist mein erster Beitrag hier 🤪. Aber zum ...

Netzwerke
Frage zu Spanning-Tree-Layout
Frage von LordGurkeNetzwerke10 Kommentare

Hallo zusammen, ich habe aktuell das Problem, dass in einem relativ frisch aufgebauten Netzwerk mit redundanten Pfaden und MSTP ...