5

根据MSDN

“必须在公共非静态字段或属性上声明参数。应在属性上声明参数。属性必须具有公共 set 访问器,并且如果指定了 ValueFromPipeline 或 ValueFromPipelineByPropertyName 关键字,则该属性必须具有公共 get 访问器。”

为什么我必须在我的 cmdletValueFromPipeline参数中声明 get 访问器?据我所知,PowerShell 只需要输入它们的值,而不是读出它们。谢谢(顺便说一句,我只是对这种行为感到好奇:))。

4

1 回答 1

3

PowerShell在分配从管道获得的新值之前,会读取标有ValueFromPipeline或的参数的默认值ValueFromPipelineByPropertyName进行备份。

请考虑以下 cmdlet:

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

以下情况适用:

  • New-Postcmdlet将新创建的对象返回到具有属性的管道PostTitle
  • cmdlet 上的InputObject属性Set-Post标记为ValueFromPipeline = true
  • cmdlet 上的Title属性Set-Post标有ValueFromPipelineByPropertyName = true

将它们与以下命令结合使用:

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

Set-Post并在cmdlet属性的 get 访问器上设置断点会Title导致以下堆栈跟踪:

PowerShell 中参数绑定的堆栈跟踪

如您所见,在将cmdlet 上的属性与来自管道的对象的相应属性的值CmdletParameterBinderController.GetDefaultParameterValue绑定的过程中调用该方法。TitleSet-Post

于 2012-04-11T14:54:15.043 回答