2016-07-12 24 views
4

Ich habe eine einfache Funktion, die zwei Parameter hat. Ich habe sie nicht als positional erwähnt, aber wenn ich die Hilfe für diese Funktion überprüfe, weist sie ihnen automatisch eine Position zu. Wie kann ich sie zwingen, nur als Parameter bezeichnet zu werden (Wert nicht nach Position akzeptieren)?Benannte Parameter in PowerShell als Position

Function Test-Params 
{ 
    Param 
    (
     [Parameter(Mandatory,ValueFromPipeline,ValueFromPipelineByPropertyName)] 
     $Param1, 

     [Parameter(ValueFromPipeline,ValueFromPipelineByPropertyName)] 
     $Param2 
    ) 

    Write-Host "$Param1 $Param2" 
} 

Wenn ich überprüfen Sie die Hilfe für diese Funktion oder versuchen, die Funktion, indem Parameter Positionswerte ausführen es funktioniert (aber es sollte nicht):

Test-Params test1 test2 
test1 test2 

Hilfe Ausgabe:

help Test-Params -Full 

NAME 
    Test-Params 

SYNTAX 
    Test-Params [-Param1] <Object> [[-Param2] <Object>] [<CommonParameters>] 


PARAMETERS 
    -Param1 <Object> 

     Required?     true 
     Position?     0 
     Accept pipeline input?  true (ByValue, ByPropertyName) 
     Parameter set name   (All) 
     Aliases      None 
     Dynamic?      false 

    -Param2 <Object> 

     Required?     false 
     Position?     1 
     Accept pipeline input?  true (ByValue, ByPropertyName) 
     Parameter set name   (All) 
     Aliases      None 
     Dynamic?      false 

Antwort

4

Standardmäßig sind alle Funktionsparameter positionsabhängig. Windows PowerShell weist Positionsnummern Parametern in der Reihenfolge zu, in der die
Parameter in der Funktion deklariert sind. Um diese Funktion zu deaktivieren, setzen Sie den Wert des Arguments PositionalBinding des Attributs CmdletBinding auf $ False.

Source.

So sieht Ihre Funktion wie folgt aus:

Function Test-Params 
{ 
    [CmdletBinding(PositionalBinding=$false)] 
    Param 
    (
     [Parameter(Mandatory,ValueFromPipeline,ValueFromPipelineByPropertyName)] 
     $Param1, 

     [Parameter(ValueFromPipeline,ValueFromPipelineByPropertyName)] 
     $Param2 
    ) 

    Write-Host "$Param1 $Param2" 
} 
+0

Excellent !! Danke für die Eingaben. Es klappt. – SavindraSingh

+1

Gut zu wissen; mit 'PositionalBinding = $ false' an Ort und Stelle, verwenden Sie parameterspezifische 'Position = ' Attribute (z. B.' [Parameter (Obligatorisch, Position = 0)] ', um ausgewählte Parameter explizit positionell zu machen. – mklement0

Verwandte Themen