1

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

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

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

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

  1. 有没有解决这个问题的方法?
  2. 这些相同的参数也设置了Mandatory属性。如果没有 PowerShell 抱怨没有这些必需的参数,我怎么能做到这一点?

提前感谢您的想法。


更新

当我意识到我只是不太了解管道绑定参数时,我取出了问题的第二部分。我错误地认为管道绑定参数来自在管道中执行的先前 Cmdlet。实际上来自通过管道传递的对象!我参考了Keith Hill 的一篇文章来帮助理解这一点。

4

1 回答 1

2

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

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

于 2009-08-20T02:07:59.813 回答