5

MSDNによると:

「パラメーターはパブリックの非静的フィールドまたはプロパティで宣言する必要があります。パラメーターはプロパティで宣言する必要があります。プロパティにはパブリック set アクセサーが必要であり、ValueFromPipeline または ValueFromPipelineByPropertyName キーワードが指定されている場合、プロパティにはパブリック get アクセサーが必要です。」

ValueFromPipelineコマンドレットパラメーターで get アクセサーを宣言する必要があるのはなぜですか? 私の知る限り、PowerShell はそれらの値を読み込む必要はなく、入力するだけで済みます。ありがとう(ちなみに、この動作に興味があるだけです:))。

4

1 に答える 1

3

PowerShellは、またはでマークされたパラメーターの既定値を読み取り、パイプラインから取得した新しい値を割り当てる前にバックアップを作成します。ValueFromPipelineValueFromPipelineByPropertyName

次のコマンドレットを検討してください。

New-Post -Title <string>
Set-Post -InputObject <Post> -Title <string>

以下が適用されます。

  • New-Postコマンドレットは、プロパティを持つパイプラインに新しく作成されたオブジェクトを返します。PostTitle
  • コマンドレットのInputObjectプロパティはSet-PostValueFromPipeline = true
  • コマンドレットのTitleプロパティSet-Postは でマークされていValueFromPipelineByPropertyName = trueます。

次のコマンドでそれらを組み合わせます。

New-Post -Title "Foo" | Set-Post

Set-Postコマンドレットのプロパティの get アクセサーにブレークポイントを設定するとTitle、次のスタック トレースが生成されます。

PowerShell でのパラメーター バインディングのスタック トレース

ご覧のとおり、コマンドレットのプロパティを、パイプラインから取得したオブジェクトの対応するプロパティの値にバインドするプロセス中に、メソッドがCmdletParameterBinderController.GetDefaultParameterValue呼び出されます。TitleSet-Post

于 2012-04-11T14:54:15.043 に答える