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, 43648 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
Windows 10
Zero-Day-Lücke in Microsoft Edge
Information von kgborn vor 2 TagenWindows 10

In Microsofts Edge-Browser klafft wohl eine nicht geschlossene (0-Day) Sicherheitslücke im Just In Time Compiler (JIT Compiler) für Javascript. ...

Sicherheit
Microsoft und Skype: Sicherheit
Information von kgborn vor 2 TagenSicherheit

Die Tage gab es ja einige Berichte zur Sicherheit des Skype-Updaters. Der Updater von Skype läuft unter dem Konto ...

Datenschutz

Behörden ignorieren Sicherheitsbedenken gegenüber Windows 10

Information von Penny.Cilin vor 3 TagenDatenschutz8 Kommentare

Hallo, passend zum Thema Ablösung LIMUX in München ein interessanter Beitrag dazu: Behörden ignorieren Sicherheitsbedenken gegenüber Windows 10 Anscheinend ...

Sicherheit
Information Security Hub Munich airport
Information von brammer vor 3 TagenSicherheit

Hallo, Neues Center für Cyber Kriminalität am Münchener Flughafen brammer

Heiß diskutierte Inhalte
Windows 10
Windows 10 (1709) Tastur und Maus wieder einschalten?
Frage von LochkartenstanzerWindows 1016 Kommentare

Moin, Ich habe von einem Kunden einen Win10-Rechner bekommen, bei dem weder Tastatur noch Maus geht. Die Hardware funktioniert ...

Humor (lol)
Was könnte man mit einem Server machen? Idee gesucht
Frage von 2SeitenHumor (lol)12 Kommentare

Hey Zusammen Ich habe einen alten HP G2 Rackserver zu Hause rumliegen. 28GB Ram, 1xAMD Prozi mit etwa 2GHz. ...

Server-Hardware
Server für Exchange 2016, Kaufberatung
Frage von MazenauerServer-Hardware10 Kommentare

Guten Tag werte Gemeinde, Vorab: Ich dachte es gab mal einen separaten Bereich für solche Anfragen, habe ich leider ...

Firewall
RB2011 Firewall Rule eine bestimmte Mac oder IP Adresse nicht zu blockieren
Frage von lightmanFirewall10 Kommentare

Hallo liebes Forum mit ihren Spezialisten. Ich habe meine Firewall so konfiguriert das kein Endgerät ohne meine Speziellen Erlaubnis ...