【问题标题】:Cmdlet parameter type to select a parameter set用于选择参数集的 Cmdlet 参数类型
【发布时间】:2012-08-22 23:57:52
【问题描述】:

使用 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 值指定。

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

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

谢谢,

【问题讨论】:

  • 再来一次为什么switch不能用?
  • 因为我认为像“Create-IceCream -Choco:$false”这样的东西没有意义。它将调用“Choco”集,没有“Choco”。你明白了吗?我想我所追求的是一个真正的开关参数,一个不存在或存在的参数。就像在常规控制台类型命令中一样。与微软的 SwitchParameter 不同,它可以不存在,存在:$true 或存在:$false。
  • 在这种情况下您不必创建开关参数。您只需要两个不同的参数集,无论您喜欢什么类型。

标签: c# powershell


【解决方案1】:

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

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

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

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

编辑

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

【讨论】:

  • 谢谢。我遇到的问题是,这些不同集合中的所有必需参数都不是唯一的,尽管基础/相应代码完全不同。另一方面,唯一参数是可选的!我猜不存在具有 null 或非 null/存在性质的此类参数。
  • 似乎 SwitchParameter 是我能得到的最接近的。你是对的,我可以测试 HasValue 而忽略底层的布尔值。我只是在想可能会有更“优雅”的参数类型。
  • 感谢您抽出宝贵时间。会接受你的回答。关于使用 Enum 类型。由于你提到的原因,我不想这样做。我还考虑过使用 ArgumentTransformation 属性来装饰 switch 参数,这将写入 $false 并出错,但是,除了仍然违反直觉之外,这是一种矫枉过正!我想知道为什么微软选择以这种方式实现 SwitchParameter,因为您可以使用可选的 Nullable 布尔参数来实现相同的功能。无论如何..
  • 开关需要显式设置才能启用 programmatic 规范。例如您的脚本需要执行dir,但根据先前计算的结果,它可能需要递归,也可能不需要。您可以拨打dir -Recurse:$needToRecurse 而不是if($needToRecurse){ dir -Recurse }else{ dir }。我同意这与你的情况不同,但我们只有一种开关类型,所以我们必须使用它:)
猜你喜欢
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
  • 2012-08-09
相关资源
最近更新 更多