PowerShell – 11 – Funktionen (Functions)

Unter PowerShell gibt es ebenso wie in VBS Funkionen. Dennoch gibt es bei der Verwendung dieser einige Besonderheiten zu beachten. Funktionen müssen explizit aufgerufen werden damit der Code innerhalb der Funktion ausgeführt werden kann. Innerhalb eines Scriptes werden Funktionen über ihren Namen aufgerufen. Optional können natürlich auch hier Parameter übergeben werden. Im Gegensatz zu VBS müssen die Funktionen innerhalb eines Scriptes erst definiert werden bevor man sie aufgerufen kann. Wird die Funktion im Script aufgerufen, bevor sie initialisiert wurde, läuft das Script in einen Error wie in dem folgenden Beispiel.

Meinst das lautet dieser wie folgt „Time : Die Benennung „Time“ wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.In Zeile:3 Zeichen:1+ Time1„. Um das Script korrekt ausführen zu können, muss die Funktion vorher wie im nächsten Script definiert sein.

Da nun die Funktion vor dem eigentlich Aufruf initialisiert wurde, könnte diese auch aufgerufen werden. Funktionen werden immer nach einem Schema aufgebaut.

EDIT November 06.11.2013,10:48 Uhr
Thomas Franke (http://www.thomas-franke.net) hat für dieses Problem eine sehr gute Idee. Wenn das Hauptscript am Anfang stehen soll, so kann man dies erreichen  „[…] indem man auch das Hauptscript als Funktion definiert.“  Thomas liefert gleich das passende Beispiel für das erste von mir gezeigte Script mit.

Die Hauptfunktion Main ruft unsere eigentliche Funktion Time auf. Dies mag auf den ersten Blick komplizierter aussehen, ist aber durchaus von Vorteil bei größeren Scripten, da der Hauptteil unseres Scriptes nicht hinter endlosen Funktionen verschwindet sonder ganz oben stehen kann. An dieser Stelle noch Danke an Thomas für den Tipp.

Aufbau einer Funktion

Funktionen beginnen immer mit dem Keyword Function. Dieses zeigt an, dass eine Funktion folgt. Darauf folgt der Funktionsname, welcher selbst gewählt werden kann, anschließend folgen evtl. benötigte Parameter in Klammer. Schlusslicht und wohl wichtigstes Element bildet der Script-Block in geschwungenen Klammern. Das Ganze sieht dann so aus.

 Parameter einer Funktion übergeben

Es gibt mehrere Wege eine Funktion aufzurufen und dabei Parameter zu übergeben. Im folgendem Script habe ich eine Funktion namens Time implementiert. Diese hat die simple Aufgabe einem Benutzer entsprechend der Uhrzeit ein „Guten Morgen“, „Guten Tag“ oder ein „Guten Abend“ auszugeben. Die Funktion Time kann genau einen Parameter, den Namen des Anwenders, übergeben bekommen. Dies kann über mehrere Weg realisiert werden.  Dazu ruft man die Funktion mit ihrem Namen einfach auf. Der Parameter -name  kann per Tab (Tab-Taste zur Autovervollständigung drücken) eingeblendet werden und man kann den gewünschten Namen einfach anhängen.

Eine Variante ist also den Namen einfach anhängen oder in Hochkomas schreiben und natürlich anhängen, Time -name Stefan Rehwald oder Time -name „Konrad Ernst Otto Zuse“. Eine weitere Variante ist es die Variablen in Klammern zu übergeben, dann müssen Strings in jedem Fall in Hochkommas geschrieben werden. Time („Rudolf Diesel“).  Ebenso ist es möglich auch Variablen anzuhängen. Time ($User).

Das ist im Großen und Ganzen das ‚Geheimnis‘ um Funktionen.

rewe

6 Gedanken zu „PowerShell – 11 – Funktionen (Functions)“

  1. Da ich immer mal wieder über die Seite stolper und sie mir schon gute Dienste geleistet hat mal noch ein Hinweis der mir gerade aufgefallen ist.

    Time -name Stefan Rehwald

    ergibt richtigerweise laut deinem Listing

    #Guten Morgen Stefan,
    # Es ist Dienstag, 10. September 2013 09:23:03

    Das Rehwald wird also nicht beachtet, da Rehwald als zweiter Parameter geparsed wird, den es aber laut Parameter der Funktion nicht gibt. Das -name ist deshalb in diesem Fall auch nicht zwingend erforderlich, erst wenn man eine Funktion mit 2 oder mehr Parametern hat, (dein) Bsp.

    function Time ($name , $n_name)

    und die Parameter aus welchen Gründen auch immer nicht in der Reihenfolge übergibt oder übergeben möchte.

    Time -n_name Rehwald -name Stefan

    Natürlich fehlt jetzt noch eine Logik, die guckt ob ein n_name übergeben wird um dementsprechend den Output anzupassen.

  2. Persönlich mag ich es, wenn das Hauptscript am Anfang steht und ich nicht erst lange danach suchen muss. Das kann man erreichen, indem man auch das Hauptscript als Funktion definiert. Anschließend definiert man die anderen Funktionen und zum Schluss ruft man das Hauptscript auf. Für Dein erstes Beispiel würde das so aussehen:

    Function Main
    {
    Time
    }

    Function Time
    {
    Get-Date
    }

    Main

    Meiner Meinung nach verbessert das die Übersichtlichkeit bei längeren Scripten enorm, da man direkt sehen kann, was das Script eigentlich macht.

      1. Hallo,Stefan, hallo Thomas,

        Ich finde die Idee in Hinblick auf die Lesbarkeit des Skripts super wenn ich innerhalb der Main Funktion alle übrigen Funktionen aufrufe.

        Allerdings habe ich damit Probleme mit Variablen. Konkret wollte ich an eine Funktion, die innerhalb der Hauptfunktion aufgerufen wird, eine Variable als Parameter übergeben.

        Nach meinem Verständnis funktioniert das nicht, da die Variable der Funktion nicht bekannt ist, wenn der Wert dieser Variablen innerhalb einer anderen Funktion (der Main Funktion) gesetzt wird.

        Ich habe noch nicht versucht, noch vor der Definition der diversen Funktionen die Variablen anzulegen.

        Florian

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert