在PowerShell cmdlet参数中声明get访问器

时间:2012-04-11 14:40:32

标签: c# powershell properties parameters pipeline

根据MSDN

  

“参数必须在公共非静态字段上声明或   属性。应在属性上声明参数。该物业   必须有一个公共集访问器,如果是ValueFromPipeline或   指定ValueFromPipelineByPropertyName关键字,属性   必须有一个公共get访问器。“

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

1 个答案:

答案 0 :(得分:3)

PowerShell 读取标有ValueFromPipelineValueFromPipelineByPropertyName的参数的默认值,以便在分配从{获得的新值之前进行备份 {3}}

请考虑以下cmdlet:

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

以下适用情况:

  • New-Post cmdlet 将新创建的Post对象返回到管道,其中 Title属性
  • InputObject cmdlet上的Set-Post属性标有ValueFromPipeline = true
  • Title cmdlet上的Set-Post属性标有ValueFromPipelineByPropertyName = true

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

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

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

Stack trace for parameter binding in PowerShell

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