0

我不确定这是否存在或不可能,或者最好只使用两个参数来实现,我不确定使用通用上下文或更具体的示例是否会更清楚,所以我'已经提供了两个:

更通用

我有一种情况,我更喜欢 PowerShell 函数的三种不同行为之一,基于参数。它的行为有点像一个开关参数,$false如果没有提供,则具有一个值 ( ),如果提供,则具有不同的值 ( $true)。如果提供了一个值 (a [string]),第三个选项将做出更具体的行为,这将使它更像一个完整的参数。

更详细

具体来说,我正在考虑这样一种情况,即可以返回的对象可能有多种独特的方式,以及多种过滤和组合它们的方式。我想将这三种类型的行为组合到“Get-Stuff”Cmdlet 的过滤类型参数中,我想将其称为“唯一”。

  • 如果未提供(例如Get-Stuff),则不会为输出对象提供“唯一”类型的过滤 - 所有对象都将返回/通过管道传输到输出。
  • 如果要提供参数,但没有值(例如Get-Stuff -unique),我希望参数的默认值指定属性的名称,也许Name,其中每个返回的结果都将确保具有唯一的名称,(也许是第一个找到的,或者不确定的)
  • 如果为参数提供了一个例如组合)。每个返回/管道对象将具有命名属性的唯一(组合)值Get-Stuff -unique "Context","ID"

无论此信息的具体用途如何...

抛开实际功能不谈,有没有办法以这种方式将信息传递给 Cmdlet?我想我可以组合一个参数和一个开关(也许-unique-indexFields),或者让一个参数覆盖一个开关等,但是是否可以只使用一个参数而不是两个?

4

1 回答 1

1

如果需要,您可以通过查看参数的值并提供默认值来伪造它,但我不建议这样做。虽然您可以通过使用参数集来拥有互斥参数,但这不适用于具有相同名称但不同参数集中的不同类型的参数,因此该选项不可用。

在你的情况下,我实际上会选择类似的东西

Get-Stuff                     # without filtering
Get-Stuff -Unique             # Uniqueness by name only, by virtue of ...
Get-Stuff -Unique -Property Context,ID  # the Property parameter with a default value of Name

这模仿了其他 cmdlet 中的工作方式,例如Select-Object, Measure-Object,Group-Object等:

function Get-Stuff {
  param(
    [switch] $Unique,
    [array] $Property = @('Name')
  )
  # ...
}
于 2016-03-08T19:42:31.070 回答