PowerShell Parameter auf gültige Werte prüfen

Bei der Übergabe von Parametern möchte man diese evtl. auf gültige Werte einschränken. Natürlich kann diese Überprüfung selbst mit if-Anweisungen erledigt werden. Gültige Werte können aber auch schon bei der Definition der Parameter vorgegeben werden.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# Definition der Parameter
Param(
    [Parameter(Mandatory=$True)]
    [string]$StringParameter1,

    [Parameter(Mandatory=$True)]
    [ValidateSet("String1","String2")]
    [string]$StringParameter2,

    [Parameter(Mandatory=$True)]
    [int]$IntegerParameter1,

    [Parameter(Mandatory=$True)]
    [ValidateRange(0, 5)]
    [int]$IntegerParameter2
)

# eigene Überprüfung der Parameter
if (-not($StringParameter1 -eq "String1" -or $StringParameter1 -eq "String2")) {
    Write-Output "Fehler! Gültige Werte für StringParameter1 sind ""String1"" und ""String2""."
    exit
}
if ($IntegerParameter1 -lt 0 -or $IntegerParameter1 -gt 5) {
    Write-Output "Fehler! Wert für IntegerParameter1 muss im Bereich 0 bis 5 liegen."
    exit
}

# Ausgabe der Parameter
Write-Output "StringParameter1: $StringParameter1"
Write-Output "StringParameter2: $StringParameter2"
Write-Output "IntegerParameter1: $IntegerParameter1"
Write-Output "IntegerParameter2: $IntegerParameter2"

Im Beispiel werden $StringParameter1 und $IntegerParameter1 durch eigenen Code überprüft (Zeile 18 bis 24). Die beiden anderen Parameter werden mit ValidateSet (Zeile 7) und ValidateRange (Zeile 14) auf gültige Werte geprüft. In beiden Fällen dürfen als String “String1” oder “String2” und als Integer die Zahlen von 0 bis 5 übergeben werden. Als Beispiele die Fehlerausgabe bei der eigenen Überprüfung

PS C:\> .\ValidatePowerShellParameter.ps1 -StringParameter1 "ein anderer String" -StringParameter2 "String2" -IntegerParameter1 3 -IntegerParameter2 5
Fehler! Gültige Werte für StringParameter1 sind "String1" und "String2".
At C:\ValidatePowerShellParameter.ps1:20 char:10
+     Throw <<<<  "Fehler! Gültige Werte für StringParameter1 sind ""String1"" und ""String2""."
    + CategoryInfo          : OperationStopped: (Fehler! Gültige... und "String2".:String) [], RuntimeException
    + FullyQualifiedErrorId : Fehler! Gültige Werte für StringParameter1 sind "String1" und "String2".

und bei einem Fehler mit ValidateRange.

PS C:\> .\ValidatePowerShellParameter.ps1 -StringParameter1 "String1" -StringParameter2 "String2" -IntegerParameter1 3 -IntegerParameter2 8
C:\ValidatePowerShellParameter.ps1 : Cannot validate argument on parameter 'IntegerParameter2'. The 8 argument is greater than the maximum allowed range of 5. Supply an argument that is less than 5 and then try the command again.
At line:1 char:120
+ .\ValidatePowerShellParameter.ps1 -StringParameter1 "String1" -StringParameter2 "String2" -IntegerParameter1 3 -IntegerParameter2 <<<<  8
    + CategoryInfo          : InvalidData: (:) [ValidatePowerShellParameter.ps1], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,ValidatePowerShellParameter.ps1

Neben ValidateSet und ValidateRange gibt es noch weitere [Möglichkeiten](https://technet.microsoft.com/en-us/library/dd347600.aspx ““about_Functions_Advanced_Parameters” im Microsoft TechNet”):

  • ValidateCount
  • ValidateLength
  • ValidatePattern
  • ValidateRange
  • ValidateScript
  • ValidateSet
  • ValidateNotNull
  • ValidateNotNullOrEmpty

Ein kurzes Beispiel für ValidateScript:

1
2
3
4
5
6
7
8
9
# Definition der Parameter
Param(
    [Parameter(Mandatory=$True)]
    [ValidateScript({$_ -match "St.*g"})]
    [string]$StringParameter
)

# Ausgabe der Parameter
Write-Output "StringParameter: $StringParameter"

Leider ist es nicht möglich innerhalb des ValidateScript-Teils auf andere übergebene Parameter zuzugreifen. Sind die gültigen Werte eines Parameters also abhängig vom Wert eines weiteren Parameters, muss die Überprüfung außerhalb der Parameterdefinition erfolgen.

Außerdem ist zu beachten, dass nur übergebene Parameter überprüft werden. Wird ein Wert als Default gesetzt und nicht als Parameter übergeben, findet keine Überprüfung statt und der Wert muss (soweit wirklich erforderlich) mit eigenem Code geprüft werden.

1
2
3
4
5
6
7
8
9
# Definition der Parameter
Param(
    [Parameter(Mandatory=$False)]
    [ValidateRange(0,5)]
    [string]$IntegerParameter=8
)

# Ausgabe der Parameter
Write-Output "IntegerParameter: $IntegerParameter"
PS C:\> .\ValidatePowerShellParameter.ps1
IntegerParameter: 8

PS C:\> .\ValidatePowerShellParameter.ps1 -IntegerParameter 8
C:\ValidatePowerShellParameter.ps1 : Cannot validate argument on parameter 'IntegerParameter'. The 8 argument is greater than the maximum allowed range of 5. Supply an argument that is less than 5 and then try the command again.
At line:1 char:43
+ .\ValidatePowerShellParameter.ps1 -IntegerParameter <<<<  8
    + CategoryInfo          : InvalidData: (:) [ValidatePowerShellParameter.ps1], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,ValidatePowerShellParameter.ps1