PowerShell-Funktionen mit Parametern aufrufen

    Parameter in einer PowerShell-Funktion definierenBeim Auf­ruf von Funk­tionen mit Para­metern unter­scheidet sich die PowerShell syntak­tisch von den meisten anderen Sprachen. Der ver­sehent­liche Ein­satz von Klam­mern und Kommata führt dann zu uner­wün­schten Ergeb­nissen. Diese kann man durch die Akti­vierung des Strict-Mode und benannte Para­meter ver­meiden.

    In fast allen gängigen Programmier­sprachen über­gibt man Argumente an eine Funktion, indem man diese in Klammern setzt und durch Kommata trennt, also nach dem Muster

    func(a, b, c);

    Dagegen will PowerShell hier weder Klammern noch Kommata, sondern nur Leerzeichen zwischen den Parametern. Verwendet man trotzdem die weit verbreitete Syntax, dann führt dies zu uner­warteten Ergebnissen. Dies sei anhand der Funktion test-func veranschaulicht, die 3 Parameter definiert:

    Ruft man sie nun mit

    test-func("Peter", 1, "mail@mymail.com")

    auf, dann erhält man dieses Ergebnis:

    Arg1: Peter 1 mail@mymail.com, Arg2: 0, Arg3:

    Der Aufruf einer function, der die Parameter in Klammern und getrennt durch Kommata übergibt, bringt falsche Ergebnisse.

    Alle drei an die Funktion übergebenen Werte finden sich nun in der Variablen $Name, während $ID und $Email auf 0 bzw. leer bleiben.

    Interpretation des Parameters als Array

    Die Erklärung dafür lautet, dass PowerShell den Klammer­ausdruck im obigen Beispiel als Array inter­pretiert, das es dem ersten Parameter $Name zuschlägt. Die beiden anderen gehen leer aus.

    Das gleiche Ergebnis erhält man auch, wenn man die Klammern weglässt und anstelle der Leerzeichen ein Komma als Trenner zwischen den Argumenten verwendet:

    test-func "Peter", 1, "mail@mymail.com"

    Die Gefahr für falsche Aufrufe erhöht sich dadurch, dass PowerShell bei Methoden von .NET-Klassen bzw. PowerShell-Objekten die Argumente sehr wohl in Klammern erwartet, aber eben nicht bei Funktionen. Hier ein Beispiel für einen Methoden-Aufruf bei einer String-Operation:

    ("Hallo Welt").split("l ", 2)

    Strict-Mode

    Schützen kann man sich gegen das falsche Aufrufen von functions nach dem Muster von Methoden, indem in einem Script den strict-Mode aktiviert:

    Set-StrictMode -Version Latest

    Der Parameter Version unterstützt neben Latest noch die Werte 1, 2, oder 3.

    Der Strict-Mode verhindert den Aufruf von Funktionen nach dem Muster von Methoden.

    Aufruf mit benannten Parametern

    Eine weitere Fehlerquelle beim Aufruf von Funktionen kann die Reihenfolge der Parameter sein. Im obigen Beispiel gibt die Definition der function nicht explizit die Position der Parameter durch das dafür vorgesehene Keyword vor. Daher muss man die Parameter beim Aufruf in der Reihenfolge anordnen, in der sie definiert wurden.

    Es leuchtet ein, dass

    test-func "mail@mymail.com" 1 "Peter"

    aufgrund der falschen Zuordnung von Werten zu $Name und $Email zu uner­wünschten Ergebnissen führt.

    Einen gewissen Schutz gegen eine falsche Abfolge der Argumente bietet die Deklaration von $ID als integer, so dass an der 2. Position keiner der beiden Strings stehen kann, ohne dass es eine Fehler­meldung setzt.

    Eine gute Vorbeugung gegen derartige Fehler besteht darin, eine Funktion mit benannten Parametern aufzurufen. In diesem Fall spielt die Reihenfolge dann keine Rolle mehr, und die Versuchung, Klammern zu verwenden, ist dann auch nicht mehr gegeben.

    Die Autovervollständigung beschleunigt die Eingabe von benannten Parametern.

    Im unserem Beispiel würde das so aussehen:

    test-func -Name "Peter" -ID 1 -Email "mail@mymail.com"

    Auch wenn dies nach mehr Tipparbeit aussieht, so fällt diese in der Praxis nicht ins Gewicht, weil PowerShell die Eingabe der Parameter­namen durch die automatische Vervoll­ständigung unterstützt.

    Explizite Positionsparameter

    Eine weitere Eigenheit von PowerShell-Funktionen besteht darin, dass die Festlegung der Position für einen Parameter automatisch dazu führt, dass man für alle anderen den Namen angeben muss.

    Wenn in unserem Beispiel der Parameter $Email so

    [Parameter(Position=2)]
    [string]$Email

    definiert wird, dann sind beim Aufruf die Namen der Parameter $Name und $ID erforderlich. Anderfalls wirft PowerShell einen Fehler aus.

    Legt man die Position für einen Parameter explizit fest, dann werden die anderen zu benannten Parametern.

    Wenn man jedoch die einfache Variante mit den impliziten Positions­parametern bevorzugt, dann kann man im Zweifel die korrekte Reihenfolge mit Get-Help anzeigen.

    Get-Help zeigt die Namen und Reihenfolge der Parameter einer function

    In unserem Beispiel sähe das so aus:

    Get-Help test-func

    Keine Kommentare