使用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。
谢谢,
答案 0 :(得分:2)
如果您在组之间拥有真正唯一的参数,那么您根本不需要“selector”参数。指定的“可操作”参数将自行确定该集合。这是推荐的方法,也是大多数cmdlet工作的方式。
但有时它会让用户更清楚地提供这样的参数。 Switch
是你最好的选择,尽管你担心。 ParameterSets完全由存在参数完成,它们完全不知道任何指定参数的值。因此,没有任何类型的完美选择。 Switch
提供了最简单的界面。
考虑到交换机参数的99%使用是简单存在/不存在,用户必须通过传递-Choco:$false
来努力解决这个问题。 powershell将以任一方式强制执行参数,因此无法同时传递-Choco:$false -Cherry:$true
。
根据我的经验,很少有用户甚至意识到你可以将明确的值传递给Switch
,而那些确实更有经验并且不会犯这种错误的人。
修改强>
另一种选择是使用单个-IceCreamType
参数,该参数带有Enum
或带有ValidateSet
的字符串。它可以是必需参数,是所有参数的一部分。然后在内部,您可以根据需要解释剩余的共享参数。但是,Powershell会抱怨,如果根据传递的args无法找出参数集,那么这种方法存在一些危险。您可以使用DefaultParameterSetName
来解决这个问题,但在所有这些之后,您首先会失去使用参数集的价值。