2012-04-11 33 views
5

根据MSDN申报get访问在PowerShell命令参数

“参数必须在公共非静态字段或 性声明的参数应该在性能声明属性 必须有一个公共集。存取器,并且如果指定了ValueFromPipeline或ValueFromPipelineByPropertyName关键字,则属性 必须具有公共获取存取器。“

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

+0

这似乎是一个奇怪的要求。我只能假定它是一个实现人为因素(即漏泄抽象):在处理验证和应用于参数属性的类型转换时,通过代码进行跟踪显示处理并不简单。另一方面,我很少使用除公开设置的自动属性以外的其他任何东西,并且无法想象我需要其他任何东西的情况。 – Richard 2012-04-11 15:46:16

回答

3

的PowerShell 读取默认值标有ValueFromPipelineValueFromPipelineByPropertyName进行备份前分配从the pipeline获得新值的参数

考虑以下cmdlet:

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

在以下情况:

  • New-Post cmdlet的返回新创建Post对象的管道,这一个Title财产
  • the InputObject property o n Set-Post cmdlet标记为ValueFromPipeline = true
  • Set-Post cmdlet上的Title属性标记为ValueFromPipelineByPropertyName = true

使用下面的命令,结合它们:

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

,并在Set-Post小命令的Title财产的结果在下面的堆栈跟踪get访问设置一个断点:

Stack trace for parameter binding in PowerShell

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

+0

+1引用最少惊讶的原则。 – 2012-04-11 15:19:31

+0

-1。虽然有一个逻辑,但这不是PSH的工作原理。在该cmdlet中,您可以调用WriteObject来将对象(或集合)传递到管道的下一个步骤。 – Richard 2012-04-11 15:40:50

+0

@理查德我想你误解了我的观点。我并不是说要阻止整个对象通过管道传递,而是要使用相同的名称自动分配参数*。如果相应的属性是*只写*,PowerShell将无法检索分配给cmdlet参数的值。 – 2012-04-11 16:20:54