【问题标题】:How do I get around PowerShell not binding pipeline parameters until after BeginProcessing is called?如何在调用 BeginProcessing 之前绕过 PowerShell 不绑定管道参数?
【发布时间】:2009-08-21 02:23:40
【问题描述】:

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

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

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

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

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

提前感谢您的想法。


更新

我意识到我只是不太了解管道绑定参数,因此我提出了问题的第二部分。我误以为管道绑定参数来自管道中执行的 previous Cmdlet。实际上来自通过管道传递的object!我引用了post by Keith Hill 来帮助理解这一点。

【问题讨论】:

    标签: powershell powershell-cmdlet


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢基思。为了避免不得不一次性运行昂贵的代码来“特殊情况” ProcessRecord(),我希望有一些其他神奇的方法可以在 BeginProcessing() 中保持“干净”。我想好像没有。感谢您的建议,也感谢您关于按名称绑定管道参数的博客条目。我会在问题中链接它。
    猜你喜欢
    • 1970-01-01
    • 2016-03-06
    • 2018-07-29
    • 1970-01-01
    • 2019-05-15
    • 2021-10-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多