0

使用 c# 编写具有多个参数集的 PowerShell cmdlet。

是否有可用于限定/选择所需集的参数类型?

例如,假设我有这些 Create-IceCream cmdlet 的参数集:

Create-IceCream [-Choco] .. <insert Choco specific parameters here>

Create-IceCream [-Cherry] .. <insert Cherry specific parameters here>

Create-IceCream .. <insert plain specific parameters here>

参数“Choco”和“Cherry”的类型是什么?显然 SwitchParameter 类型不能使用,因为它仍然可以用 $false 值指定。

Enum 类型不会那么直观,并且需要我创建许多动态参数。

有任何想法吗?我可能应该提到,对于这个问题,我们假设我仅限于创建一个 cmdlet。

谢谢,

4

1 回答 1

2

如果您有在集合之间真正唯一的参数,那么您根本不需要“选择器”参数。指定的“可操作”参数将自行确定集合。这是推荐的方法,也是大多数 cmdlet 的工作方式。

不过,有时它确实让用户更清楚地提供这样的参数。 Switch是您最好的选择,尽管您有顾虑。ParameterSets 完全通过参数的存在来工作,它们完全不知道任何指定参数的。因此,没有任何类型的完全完美的选择。 Switch提供最简单的可用界面。

-Choco:$false考虑到 99% 的 switch 参数的使用是简单的存在/不存在,用户必须非常努力地通过传递来解决这个问题。并且 powershell 将以任何一种方式强制执行参数集,因此不可能同时传递-Choco:$false -Cherry:$true.

以我的经验,很少有用户甚至意识到您可以将显式值传递给 a Switch,而那些这样做的人往往更有经验并且无论如何都不会犯这种错误。

编辑

另一种选择是使用单个-IceCreamType参数,该参数Enum采用ValidateSet. 它可以是强制参数,是所有参数集的一部分。然后在内部,您可以根据需要解释剩余的共享参数。但是,Powershell 会抱怨,如果它无法根据传递的 args 找出参数集,因此这种方法存在一些危险。您可以使用 a 来解决DefaultParameterSetName,但在所有这些之后,您开始失去使用参数集的价值。

于 2012-08-22T15:38:23.197 回答