2016-07-12 2 views
4

У меня есть простая функция, которая имеет два параметра. Я не упоминал их как позиционные, но все же, когда я проверяю помощь для этой функции, она автоматически назначает им позицию. Как я могу заставить их иметь только указанный параметр (не принимать значение по положению)?Именованный параметр в PowerShell, показывающий как Positional

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

     [Parameter(ValueFromPipeline,ValueFromPipelineByPropertyName)] 
     $Param2 
    ) 

    Write-Host "$Param1 $Param2" 
} 

Когда я проверяю помощь для выполнения этой функции или попытаться запустить функцию, обеспечивая параметры значения позиционного это работает (но это не должно работать):

Test-Params test1 test2 
test1 test2 

Помощь выход:

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 

ответ

4

По умолчанию все параметры функции являются позиционными. Windows PowerShell присваивает номера позиций параметрам в том порядке, в котором в функции объявлены параметры
. Чтобы отключить эту функцию, установите значение аргумента PositionalBinding атрибута CmdletBinding в значение $ False.

Source.

Так что ваша функция выглядит следующим образом:

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

     [Parameter(ValueFromPipeline,ValueFromPipelineByPropertyName)] 
     $Param2 
    ) 

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

Отлично !! Спасибо за вклад. Оно работает. – SavindraSingh

+1

Полезно знать; с 'PositionalBinding = $ false' на месте, используйте атрибуты' Position = ', специфичные для параметра (например,' [Parameter (Обязательный, Position = 0)] ', чтобы явно сделать параметры выбора позиционными. – mklement0

Смежные вопросы