1. ホーム

PostionalBindingの役割のCmdletBindingAttribute

2022-02-08 23:13:55

前回はAdvanced FunctionのHelpURIについてお話しましたが、今日はもう一つの新機能、"PositionalBinding"についてお話します。

PositionalBinding パラメータは、メソッド内のパラメータの位置を決定するために使用され、$true または $false のいずれかに設定することができます。次に、Functionで何をするのかを見てみましょう。

Function Test-Positional
{
    [CmdletBinding()]
    Param
    (
        [Parameter()]
        $StringData1,
        [Parameter()]
        $StringData2
    )

    Write-Host -Object $StringData1
    Write-Host -Object $StringData2
}

Test-Positional "A" "B"

上の例と同じように、この関数でも、Functionを定義するときにいつもやっているように、パラメータ名を入力しなくてもエラーにならないようにしています。

ここでも、PositionalBindingの設定を併用するとどうなるかを見てみましょう。PositionalBindingを$Falseに設定すると、位置パラメーターバインディングが不要になります。

Function Test-Positional
{
    [CmdletBinding(PositionalBinding=$False)]
    Param
    (
        [Parameter()]
        $StringData1,
        [Parameter()]
        $StringData2
    )

    Write-Host -Object $StringData1
    Write-Host -Object $StringData2
}

Test-Positional "A" "B"

unbound positionパラメータを設定し、Positionを設定していないため、パラメータ名を入力しない場合、メソッドはパラメータ名が一致する位置が見つからないとプロンプトを出すので、$Falseを設定している場合は、動作させるためにパラメータ名を強制的に指定しなければならないことに注意してください。

Test-Positional : A positional parameter cannot be found that accepts argument 
A positional parameter cannot be found that accepts argument 'A'.
At line:16 char:1
+ Test-Positional "A" "B"
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidArgument: (:) [Test-Positional], Paramete 
   rBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Test-Positional





そこで、未束縛のパラメータ位置を設定する際には、そのパラメータごとに位置を指定することで、メソッドが対応するパラメータ値に問題なくマッチングするようにすればよいのです。

Function Test-Positional
{
    [CmdletBinding(PositionalBinding=$False)]
    Param
    (
        [Parameter(Position=0)]
        $StringData1,
        [Parameter(Position=1)] $StringData1, [Parameter(Position=1)]
        $StringData2
    )

    Write-Host -Object $StringData1
    Write-Host -Object $StringData2
}

Test-Positional "A" "B"





パラメータ位置が指定されていない場合、パラメータ名を手入力することで強制的に実行させることは確かに可能です。

Function Test-Positional
{
    [CmdletBinding(PositionalBinding=$False)]
    Param
    (
        [Parameter()]
        $StringData1,
        [Parameter()]
        $StringData2
    )

    Write-Host -Object $StringData1
    Write-Host -Object $StringData2
}

Test-Positional -StringData1 "A" -StringData2 "B"