| | 0

PowerShell: Typisierung von Parametern, Initialisierung von Parametern, Switchparameter – Part 15.1

4.1.1 Typisierung von Parametern

Die Definition von Parametern innerhalb einer Funktion kann im einfachsten Fall ohne Angabe eines Datentyps erfolgen. In vielen Fällen ist das auch völlig ausreichend. Hin und wieder ist es jedoch sinnvoll, einen bestimmten Datentyp eines Parameters zu erzwingen. Besonders dann, wenn an diesem Parameter innerhalb der Funktion Operationen durchgeführt werden, welche nur mit einem bestimmten Datentyp funktionieren oder sinnvolle Ergebnisse ergeben und der Typ des übergebenen Arguments nicht in den erwarteten Datentyp konvertiert werden kann (was die PowerShell selbständig versuchen würde). Es würde z.B. keinen wirklichen Sinn machen, wenn zwei Parameter vom Typ String dividiert werden würden…
Um einen Parameter zu typisieren reicht es aus, den geforderten Datentyp in eckigen Klammern unmittelbar an die Parameterdefinition voranzustellen:

1
2
3
1.  [String]$Name
2.  [int32]$Jahre
3.  [DateTime]$Heute

4.1.2  Initialisierung von Parametern

Bei der Ausführung einer Funktion werden alle dort definierten Parameter mit dem Wert $Null initialisiert. Dieses Verhalten kann durch manuelle Initialisierung verändert werden. Sie tritt dann in Kraft, wenn für diesen Parameter kein Argument übergeben wurde. Die Initialisierung geschieht durch eine Zuweisung bei der Parameterdefinition. Einem Parameter kann alles zugewiesen werden, was in der PowerShell einen gültigen Ausdruck darstellt:

1
2
3
4
5
6
7
8
9
10
11
1.  Function Get-Weather
2.  >> ($Town="Roma",$TimeSpan=3)
3.  >> {Write-host "Hier ist das Wetter für $Town für die kommenden $TimeSpan Tage"
4.  >> Write-host
5.  >> }
6.  >>
7.  Get-Weather
Hier ist das Wetter für Roma für die kommenden 3 Tage
8.  Get-Weather Köln 5
Hier ist das Wetter für Köln für die kommenden 5 Tage

In diesem Beispiel werden zwei Parameter definiert und jeweils mit einem String und einer Zahl belegt. Wird die Funktion ohne Argumente aufgerufen, werden die Parameter mit den Vorgabewerten initialisiert. Werden jedoch Argumente übergeben, werden sie auch verwendet.
Ein „gültiger Ausdruck“ kann aber auch ein Skriptblock oder eine Subexpression sein. Bei der Initialisierung eines Parameters in diesem Fall wird der Skriptblock oder die Expression ausgeführt und das Ergebnis an den Parameter gebunden:

1
$MachineName = $(Throw „Parameter –MachineName ist nicht optional“)

In diesem Beispiel wird die Anweisung „Throw“ verwendet, welche einfach einen Fehler aus dem Ausdruck in Anführungszeichen generiert. Damit kann die Eingabe eines Argumentes erzwungen werden. Ab der Version 2.0 der PowerShell existieren aber wesentlich elegantere Methoden, um die Übergabe von Argumenten erforderlich zu machen (siehe Kapitel 4.1.5).

  4.1.3 Switchparameter

Mit Hilfe von Switchparametern kann das Verhalten einer Funktion „von außen“ beeinflusst werden. Ein Switchparameter ist optional und wird ohne Argumente beim Aufruf der Funktion eingegeben. Ein in der PowerShell häufig vorkommender Switch ist der „-Recurse“ Switch. Verwendet wird er z.B. in dem Cmdlet Get-ChildItem. Wenn nicht angegeben, liefert Get-ChildItem nur die Inhalte des angegebenen Pfades. Wenn „-Recurse“ verwendet wird, liefert Get-ChildItem die Inhalte des angegebenen Verzeichnisses und aller Unterverzeichnisse. Um ein Switchparameter in einer Funktion zu deklarieren, wird anstatt des Datentyps das Wort „Switch“ verwendet:

1
[Switch]$AllData

Wird „-AllData“ beim Aufruf der Funktion angegeben, erhält die Variable $AllData den Wert $True, anderenfalls $False. Dies kann in einer Abfrage innerhalb der Funktion überprüft und entsprechend ausgewertet werden. Switchparameter können aber auch anders initialisiert werden:

1
-AllData:$True oder –AllData:$False

Diese Schreibweise ist insbesondere dann vorteilhaft, wenn z.B. eine Funktion ein CMDLet ausführt, welches Switchparameter deklariert. In der üblichen Schreibweise müsste dann abgefragt werden, ob die Funktion den korrespondierenden Switchparameter übergeben bekommen hat und der Aufruf des CMD-Lets müsste dann in einer If-Else-Anweisung zweifach erfolgen. Bei der Schreibweise mit dem Doppelpunkt entfiele dieses Konstrukt.

 

Eine Übersicht aller Artikel dieser Windows PowerShell Blogserie findet ihr hier.

Zurück zu Part 15 – Skripte, Funktionen und Skriptblöcke (Parameter und Argumente)

Weiter zu Part 15.2 – Die Param Anweisung, Erweiterte Parameterdefinition (Advanced Parameters)