| | 0

PowerShell: Die Parametersets – Part 15.3

4.1.6     Parametersets

Die erweiterte Parameterdefinition erlaubt es auch, sogenannte Parametersets zu definieren. Parametersets können mit dem Überladen von Funktionen in C# verglichen werden. Das Überladen von Funktionen hat zur Folge, dass eine Funktion unterschiedliche Signaturen*  haben kann, wobei jede Signatur ein abweichendes (oder zum Teil auch ein völlig anderes) Verhalten der Funktion bewirkt. Viele CMDLets der PowerShell verwenden diese Funktionalität (z.B. Invoke-Command implementiert sieben Parametersets, Test-Connection drei, etc.). Die erweiterte Parameterdefinition wird daher auch als CMDLet-Binding bezeichnet.

Für die Definition von Parametersets wird ein weiteres Attribut benötigt: ParameterSetName. Diesem Attribut wird der Name des Parametersets zugewiesen. Jeder Parameter kann einem oder mehreren Parametersets zugewiesen werden. Wenn keine Parametersets explizit definiert wurden, wird implizit ein Parameterset definiert, zu welchem alle Parameter gehören. Werden unterschiedliche Parametersets verwendet und wird für einen oder mehrere Parameter kein Parameterset angegeben, so gehört dieser Parameter zu allen Parametersets.

Die PowerShell Laufzeitumgebung muss imstande sein, ein Parameterset zu erkennen. Aus diesem Grund muss es pro Parameterset mindestens einen Parameter geben, welcher zu einem einzigen Parameterset gehört. Optimaler Weise sollte dieser Parameter ein mandatory Parameter sein. Häufig wird für diesen Zweck ein Switch verwendet.

Ein einfaches Beispiel soll die Bildung von Parametersets verdeutlichen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Param (
    [Parameter(Mandatory=$True, ParameterSetName="CredObj")]
    [PSCredential] $Credential,
    [Parameter(Mandatory=$True, ParameterSetName="UserName")]
    [ValidatePattern("<PatternUserName>")] **
    [String] $UserName,
    [Parameter(Mandatory=$True, ParameterSetName="UserName")]
    [ValidatePattern("<PatternDomain>")]
    [String] $Domain,
    [Parameter(Mandatory=$True, ParameterSetName="UPN")]
    [ValidatePattern("<PatternUPN>")]
    [String] $UPN,
    [Parameter(Mandatory=$True, ParameterSetName="UserName")]
    [Parameter(Mandatory=$True, ParameterSetName="UPN")]
    [String] $Password,
    [Parameter(Mandatory=$True)]
    [String] $Computername
)

Dieser Param-Statement definiert insgesamt drei Parametersets: CredObj, UserName und UPN. Das ermöglicht insgesamt drei unterschiedliche Aufrufe (ergibt drei Signaturen):

1
2
3
-Credential <pscredential> -Computername <string>
-UserName <string> -Domain <string> -Password <string> -Computername <string>
-UPN <string> -Password <string> -Computername <string>

Bei der Definition des Parameters –Computername wird kein Parameterset angegeben, so dass dieser Parameter zu allen Parametersets gehört. Zu beachten ist, dass das Attribut „Mandatory“ sich lediglich auf das jeweilige Parameterset bezieht. Das bedeutet, dass z.B. –Passwort für UserName und UPN angegeben werden muss, aber für CredObj nicht. Es ist sogar so, dass in diesem Fall –Password nicht angegeben werden darf, da sonst der Parameterset von der Laufzeitumgebung nicht eindeutig bestimmt werden kann.

*Eine Funktionssignatur besteht aus dem Funktionsnamen und den zulässigen Parametern.

**Die Überprüfung der Gültigkeit der jeweiligen Argumente wurde hier lediglich angedeutet, damit das Beispiel einfach gehalten werden kann. Die jeweiligen Pattern können wie folgt aussehen:
UserName=“^[^.][^`”\/\[\]:;|=,+*?<>\\]{1,128}$“
Domain=“^[^.\][^\/:*?`”<>|\\]{1,15}$“, UPN=“^[^.][^`”/\[\]:;|=,+*?<>\\]{1,128}@(?=^.{1,254}$)(^(?:(?!\d+\.|-)[a-zA-Z0-9_\-]{1,63}(?<!-)\.?)+(?:[a-zA-Z]{2,})$)“

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

Zurück zu Part 15.2 – Die Param Anweisung, Erweiterte Parameterdefinition (Advanced Parameters)

Weiter zu Part 16 – Rückgabewerte von Funktionen, Kommentare und Hilfe