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

Anleitung Entwicklung Batch & Shell

Mitglied: fritzo

fritzo (Level 2) - Jetzt verbinden

16.05.2005, aktualisiert 27.05.2005, 42948 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 ..
Ähnliche Inhalte
Windows 10
Mit Fax+Scan die bereits unter OL 2010 erstellten Daten nutzen
Tipp von swfadminWindows 103 Kommentare

Info, dies geht nur mit jeweils der 32 Bit-Version, um darunter alle Outlook-Daten der pst-Datei nutzen zu können. Diese ...

Neue Wissensbeiträge
Batch & Shell

Open Object Rexx: Eine mittlerweile fast vergessene Skriptsprache aus dem Mainframebereich

Information von Penny.Cilin vor 1 TagBatch & Shell9 Kommentare

Ich kann mich noch sehr gut an diese Skriptsprache erinnern und nutze diese auch heute ab und an noch. ...

Humor (lol)

"gimme gimme gimme": Automatischer Test stolpert über Easter Egg im man-Tool

Information von Penny.Cilin vor 1 TagHumor (lol)6 Kommentare

Interessant, was man so alles als Easter Egg implementiert. Ist schon wieder Ostern? "gimme gimme gimme": Automatischer Test stolpert ...

MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 1 TagMikroTik RouterOS8 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Sicherheit

Sicherheitslücke in HP-Druckern - Firmware-Updates stehen bereit

Information von BassFishFox vor 1 TagSicherheit1 Kommentar

Ein weiterer Grund, dass Drucker keinerlei Verbindung nach "auswaerts" haben sollen. Unter Verwendung spezieller Malware können Angreifer aus der ...

Heiß diskutierte Inhalte
Off Topic
Fachkräftemangel in Deutschland? - Talentschmiede schreibt alle 2 Tage die gleichen Stellen aus
Frage von Penny.CilinOff Topic12 Kommentare

Hallo, haben wir in Deutschland Fachkräftemangel? Die Talentschmiede schreibt gefühlt alle zwei Tage dieselben Stellen aus. Und das schon ...

Windows Server
Windows Store Apps
gelöst Frage von PeterleBWindows Server11 Kommentare

Gibt es einen Weg, auf Windows Server 2016 Windows Store Apps wie zum Beispiel die HP Smart App zu ...

Microsoft Office
Outlook Cache Mode Frage
Frage von GwaihirMicrosoft Office11 Kommentare

Hallo zusammen, bin gerade neu in der Firma und lerne hier einige neue Dinge kennen. Zum Beispiel, dass die ...

Microsoft
Erfahrungen mit Webcam over RDP gesucht
Frage von DerWoWussteMicrosoft10 Kommentare

Moin Kollegen. Bekanntlich kann man Webcams nur mit Drittanbietersoftware in RDP reinschleifen. Was nutzt Ihr dazu? Wie stabil funktioniert ...