Cmdlet参数类型用于选择参数集

时间:2012-08-22 11:27:57

标签: c# powershell

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

是否有参数Type可用于限定/选择所需的设置?

例如,假设我有一组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>

参数的类型是什么&#34; Choco&#34;和&#34;樱桃&#34;?显然,不能使用SwitchParameter类型,因为它仍然可以用$ false值指定。

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

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

谢谢,

1 个答案:

答案 0 :(得分:2)

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

但有时它会让用户更清楚地提供这样的参数。 Switch是你最好的选择,尽管你担心。 ParameterSets完全由存在参数完成,它们完全不知道任何指定参数的。因此,没有任何类型的完美选择。 Switch提供了最简单的界面。

考虑到交换机参数的99%使用是简单存在/不存在,用户必须通过传递-Choco:$false来努力解决这个问题。 powershell将以任一方式强制执行参数,因此无法同时传递-Choco:$false -Cherry:$true

根据我的经验,很少有用户甚至意识到你可以将明确的值传递给Switch,而那些确实更有经验并且不会犯这种错误的人。

修改

另一种选择是使用单个-IceCreamType参数,该参数带有Enum或带有ValidateSet的字符串。它可以是必需参数,是所有参数的一部分。然后在内部,您可以根据需要解释剩余的共享参数。但是,Powershell会抱怨,如果根据传递的args无法找出参数集,那么这种方法存在一些危险。您可以使用DefaultParameterSetName来解决这个问题,但在所有这些之后,您首先会失去使用参数集的价值。