PowerShell中的命名参数显示为Positional

时间:2016-07-12 14:02:16

标签: powershell parameter-passing

我有一个简单的函数,它有两个参数。我没有提到它们是位置但是,当我检查该功能的帮助时,它会自动为它们分配一个位置。如何强制它们仅被命名为参数(不按位置接受值)?

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

1 个答案:

答案 0 :(得分:4)

  

默认情况下,所有函数参数都是位置参数。 Windows PowerShell   按照顺序将位置编号分配给参数   参数在函数中声明。要禁用此功能,请设置   CmdletBinding的PositionalBinding参数的值   属性为$ False。

Source.

所以你的功能看起来像这样:

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

        [Parameter(ValueFromPipeline,ValueFromPipelineByPropertyName)]
        $Param2
    )

    Write-Host "$Param1 $Param2"
}