“参数必须在公共非静态字段或 性声明的参数应该在性能声明属性 必须有一个公共集。存取器,并且如果指定了ValueFromPipeline或ValueFromPipelineByPropertyName关键字,则属性 必须具有公共获取存取器。“
为什么我必须在我的cmdlet ValueFromPipeline
参数中声明获取访问器?据我所知,PowerShell只需要放入它们的值,而不是将它们读出来。谢谢(通过我只是好奇这种行为:))。
“参数必须在公共非静态字段或 性声明的参数应该在性能声明属性 必须有一个公共集。存取器,并且如果指定了ValueFromPipeline或ValueFromPipelineByPropertyName关键字,则属性 必须具有公共获取存取器。“
为什么我必须在我的cmdlet ValueFromPipeline
参数中声明获取访问器?据我所知,PowerShell只需要放入它们的值,而不是将它们读出来。谢谢(通过我只是好奇这种行为:))。
的PowerShell 读取默认值标有ValueFromPipeline
或ValueFromPipelineByPropertyName
进行备份前分配从the pipeline获得新值的参数。
考虑以下cmdlet:
New-Post -Title <string>
Set-Post -InputObject <Post> -Title <string>
在以下情况:
New-Post
cmdlet的返回新创建Post
对象的管道,这有一个Title
财产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访问设置一个断点:
如您所见,CmdletParameterBinderController.GetDefaultParameterValue
方法在绑定的过程中被调用Set-Post
cmdlet上的属性与来自管道对象的相应属性的值。
+1引用最少惊讶的原则。 – 2012-04-11 15:19:31
-1。虽然有一个逻辑,但这不是PSH的工作原理。在该cmdlet中,您可以调用WriteObject来将对象(或集合)传递到管道的下一个步骤。 – Richard 2012-04-11 15:40:50
@理查德我想你误解了我的观点。我并不是说要阻止整个对象通过管道传递,而是要使用相同的名称自动分配参数*。如果相应的属性是*只写*,PowerShell将无法检索分配给cmdlet参数的值。 – 2012-04-11 16:20:54
这似乎是一个奇怪的要求。我只能假定它是一个实现人为因素(即漏泄抽象):在处理验证和应用于参数属性的类型转换时,通过代码进行跟踪显示处理并不简单。另一方面,我很少使用除公开设置的自动属性以外的其他任何东西,并且无法想象我需要其他任何东西的情况。 – Richard 2012-04-11 15:46:16