根据MSDN:
“必须在公共非静态字段或属性上声明参数。应在属性上声明参数。属性必须具有公共 set 访问器,并且如果指定了 ValueFromPipeline 或 ValueFromPipelineByPropertyName 关键字,则该属性必须具有公共 get 访问器。”
为什么我必须在我的 cmdletValueFromPipeline参数中声明 get 访问器?据我所知,PowerShell 只需要输入它们的值,而不是读出它们。谢谢(顺便说一句,我只是对这种行为感到好奇:))。
根据MSDN:
“必须在公共非静态字段或属性上声明参数。应在属性上声明参数。属性必须具有公共 set 访问器,并且如果指定了 ValueFromPipeline 或 ValueFromPipelineByPropertyName 关键字,则该属性必须具有公共 get 访问器。”
为什么我必须在我的 cmdletValueFromPipeline参数中声明 get 访问器?据我所知,PowerShell 只需要输入它们的值,而不是读出它们。谢谢(顺便说一句,我只是对这种行为感到好奇:))。
PowerShell在分配从管道获得的新值之前,会读取标有ValueFromPipeline或的参数的默认值ValueFromPipelineByPropertyName进行备份。
请考虑以下 cmdlet:
New-Post -Title <string>
Set-Post -InputObject <Post> -Title <string>
以下情况适用:
New-Postcmdlet将新创建的对象返回到具有属性的管道PostTitleInputObject属性Set-Post标记为ValueFromPipeline = trueTitle属性Set-Post标有ValueFromPipelineByPropertyName = true。将它们与以下命令结合使用:
New-Post -Title "Foo" | Set-Post
Set-Post并在cmdlet属性的 get 访问器上设置断点会Title导致以下堆栈跟踪:

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