在调用BeginProcessing之前,如何绕过PowerShell不绑定管道参数?

时间:2009-08-20 00:06:01

标签: powershell cmdlets

我正在编写一个可以在管道中间调用的Cmdlet。使用此Cmdlet,可以定义ValueFromPipelineByPropertyName属性的参数,以便Cmdlet可以使用具有先前在管道中定义的相同名称的参数。

我遇到的悖论是在重写的BeginProcessing()方法中,我使用了一个可以从管道获取其值的参数。根据{{​​3}},在调用 Cmdlet Processing Lifecycle之后,才会发生管道参数的绑定。因此,如果他们试图在BeginProcessing()中使用它,我似乎无法依赖管道绑定参数。

我考虑过将事情转移到BeginProcessing()方法。不幸的是,需要进行一次相对昂贵的操作。发生这种情况的最佳位置似乎是ProcessRecord()方法,以帮助确保它只在管道中发生一次。

几个问题问题围绕着这个问题:

  1. 这周围有好的方式吗? <击>
  2. <击>
  3. 这些相同的参数也设置了BeginProcessing()属性。如果没有PowerShell抱怨没有这些必需的参数,我怎么能这么做呢?
  4. 提前感谢您的想法。


    更新

    我拿出问题的第二部分,因为我意识到我只是不太了解管道绑定参数。我错误地认为管道绑定参数来自在管道中执行的之前的 Cmdlet 。实际上来自对象通过管道传递!我引用了Mandatory来帮助理解这一点。

1 个答案:

答案 0 :(得分:2)

您可以在BeginProcessing中将实例字段bool(Init)设置为false。然后检查参数是否在BeginProcessing中设置。如果是,则调用一次执行init(InitMe)的方法。在ProcessRecord中检查Init的值,如果为false,则调用InitMe。 InitMe应该在返回之前将Init设置为true。

关于第二个问题,如果您已将参数标记为必需,则必须将其作为参数或通过管道提供。您使用多个参数集吗?如果是这样,那么即使参数被标记为必需参数,也只有在关联参数集是由PowerShell确定用于特定调用cmdlet的参数集时才是必需的。