Hallo allseits,
das folgende CodeSchnipsel funktioniert (meiner Meinung nach) nicht immer richtig, und mir ist nicht klar, wieso nicht:
Param-Example.ps1
PARAM( [Parameter(Mandatory=$true, ValueFromPipeline=$true, HelpMessage="Geben sie die Umgebung ein (Prod/Dev/Entw)", Position=0)] [alias("m", "modus", "umgebung")] [ValidateSet("Prod", "Entw", "Dev")] [String] $mode ) Write-Host "OK, `$mode enthaelt (anscheinend) einen gueltigen Wert!" Write-Host Übergebener Parameter mode: $mode
Folgende Aufrufe dieses Schnipsels funktionieren völlig korrekt, bei der Parameterübergabe eines falschen Wertes (eines Wertes der nicht in obigem ValidateSet enthalten ist) gibt die PS eine Fehlermeldung aus und bricht das Script ab, bei der Übergabe eines gültigen Params wird das Script vollständig ausgeführt:
.\Param-Example.ps1 Prod # Das Script wird vollständig, ohne Fehlermeldung ausgeführt - OK .\Param-Example.ps1 Bla # "Bla" ist kein gültiger Wert, das Script wird erwartungsgemäss abgebrochen
# Die beiden abschliessenden "Write-Host" werden also NICHT ausgeführt - OK "Prod" | .\Param-Example.ps1 # Ein gültiger Wert wird via Pipeline übergeben, das Script wird vollständig, ohne Fehlermeldung ausgeführt - OK
So weit ist alles klar, das funktioniert alles. Folgender Aufruf allerdings führt zu einem für mich völlig unerwarteten Verhalten...:
PS >"Bla" | .\Param-Example.ps1 C:\Users\31300035\PowerShell\TestScripts\Param-Example.ps1 : Das Argument für den Parameter "mode" kann nicht überprüft werden. Das Argument "Bla" gehört nicht zu dem vom ValidateSet-Attribut angegebenen Satz "Prod;Entw;Dev". Geben Sie ein Argument an, das in dem Satz enthalten ist, und führen Sie dann den Befehl erneut aus. In Zeile:1 Zeichen:9 + "Bla" | .\Param-Example.ps1+ ~~~~~~~~~~~~~~~~~~~+ CategoryInfo : InvalidData: (Bla:String) [Param-Example.ps1], ParameterBindingValidationException+ FullyQualifiedErrorId : ParameterArgumentValidationError,Param-Example.ps1 OK, $mode enthaelt (anscheinend) einen gueltigen Wert! Übergebener Parameter mode: PS >
Wie man sieht, übergebe ich via Pipeline den eigentlich ungültigen String "Bla". Die PS erkennt offensichtlich auch, dass dieser Wert ungültig, d.h. nicht im ValidateSet enthalten ist und gibt eine dementsprechende Fehlermeldung aus.
Allerdings wird das Script in diesem Fall NICHT abgebrochen, die beiden abschliessenden "write-host" werden (mit einem eigentlich ungültigen Wert der Variable $mode !) ausgeführt?!?
Warum das?!?
Wie verhindere ich bei der Parameterübergabe via Pipeline, dass das Script mit einem ungültigen Wert von $mode weiter ausgeführt wird?