5

私はこのPowerShellコマンドレットを持っています:

function Test-ParameterBinding {
    #
    # .SYNOPSIS
    # Tests parameter binding.
    #
    [CmdletBinding()]
    param (    

        [Parameter(ParameterSetName = 's1', Mandatory = $true)]
        [int] $P1,

        [Parameter(ParameterSetName = 's1')]
        [Parameter(ParameterSetName = 's2', Mandatory = $true)]
        [string] $P2,

        [Parameter(ParameterSetName = 's1')]
        [Parameter(ParameterSetName = 's3', Mandatory = $true)]
        [bool] $P3
    )
    process { $PSCmdlet }
}

このコマンドレットのヘルプは次のとおりです。

SYNTAX
    Test-ParameterBinding -P1 <Int32> [-P2 <String>] [-P3 <Boolean>] [<Com…

    Test-ParameterBinding -P2 <String> [<CommonParameters>]

    Test-ParameterBinding -P3 <Boolean> [<CommonParameters>]

コードとヘルプを見ると、次のようなコマンドレットを使用できると思います。

Test-ParameterBinding -P2 'Bind to param set s2'
Test-ParameterBinding -P3 $true # Bind to param set s3

しかし、これらの両方について、私は次のようになります。

Parameter set cannot be resolved using the specified named parameters.

質問1:s2 PowerShellはパラメーターセットにバインドできる必要がs3ありますか?私の2つの場合は?

これは、PowerShellのバージョン2に実装する時間がなかったか、この問題を発見しなかったことを意味します。

質問2:ここでの私の推論に何か問題がありますか?このような場合、パラメータのバインドは失敗しますか?


PowerShellのドキュメントで、自分の問題に直接関連している可能性のあるものを見つけました。

デフォルトのパラメーターセット名が指定されていても、WindowsPowerShellがデフォルトのパラメーターセットを使用できない場合があります。Windows PowerShellランタイムは、オブジェクトタイプのみに基づいてパラメーターセットを区別できません。たとえば、ファイルパスとして文字列を受け取る1つのパラメーターセットと、FileInfoオブジェクトを直接受け取る別のセットがある場合、Windows PowerShellは、コマンドレットに渡された値に基づいて使用するパラメーターセットを決定できません。デフォルトのパラメータセットを使用します。この場合、デフォルトのパラメーターセット名を指定しても、WindowsPowerShellはあいまいなパラメーターセットのエラーメッセージをスローします。

4

1 に答える 1

4

ロジックは正しいです。Powershellは、関数の定義と使用例に基づいてパラメーターセットを把握できるはずです。

どうやらPowershellv2には、これに十分な堅牢なロジックがなかったようです。ただし、Powershell v3では期待どおりに機能します。これは、v2の欠点/バグであることをさらに確認するものです。

于 2012-09-19T18:57:28.047 に答える