我正在编写一个具有多个可能参数的自定义PowerShell函数。
function foo {
param(
[Parameter(Mandatory=$true)]
[string]$param1_A,
[Parameter(Mandatory=$true)]
[int]$param1_B,
[Parameter(Mandatory=$true)]
[string]$param2_A,
[Parameter(Mandatory=$true)]
[int]$param2_B
)
}
我基本上有两组互斥参数。我可以指定$param1_A
或$param1_B
,但不能指定两者。我也可以指定$param2_A
或$param2_B
,但也不能同时指定。
总结一下,这是一个可能的呼叫表:
在所有情况下,至少有一个参数是强制性的。
如何声明我的参数以强制执行此要求?
我尝试使用不同的参数集,但我没有成功,因为我没有找到一种方法来描述至少一个参数的概念。
如果可以提供帮助,我的实用程序功能可以将$param1_A
转换为$param1_B
和$param2_A
转换为$param2_B
。
答案 0 :(得分:8)
好的,我设法使用参数集。我之前没有理解的是,我可以在同一个参数上声明多个[Parameter]
属性。因此,根据建议mjolinor,我实际上可以使用参数集。
以下是我的功能的更新代码:
function foo {
param(
[Parameter(Mandatory=$true, ParameterSetName='A')]
[Parameter(Mandatory=$true, ParameterSetName='C')]
[string]$param1_A,
[Parameter(Mandatory=$true, ParameterSetName='B')]
[Parameter(Mandatory=$true, ParameterSetName='D')]
[int]$param1_B,
[Parameter(Mandatory=$true, ParameterSetName='A')]
[Parameter(Mandatory=$true, ParameterSetName='B')]
[string]$param2_A,
[Parameter(Mandatory=$true, ParameterSetName='C')]
[Parameter(Mandatory=$true, ParameterSetName='D')]
[int]$param2_B
)
$PSCmdlet.ParameterSetName
}
Foo -param1_A 1 -param2_A "1"
Foo -param1_B 1 -param2_A "1"
Foo -param1_A 1 -param2_B "1"
Foo -param1_B 1 -param2_B "1"
输出:
A
B
C
D
答案 1 :(得分:3)
您需要parametersets。
以下是technet页面的示例:
Param
(
[parameter(Mandatory=$true,
ParameterSetName="Computer")]
[String[]]
$ComputerName,
[parameter(Mandatory=$true,
ParameterSetName="User")]
[String[]]
$UserName
[parameter(Mandatory=$false, ParameterSetName="Computer")]
[parameter(Mandatory=$true, ParameterSetName="User")]
[Switch]
$Summary
)
在您的示例中,您需要四个参数集,并且可以将其中一个参数集指定为默认参数集。
答案 2 :(得分:1)
标记为解决方案的帖子很好,并且相对方便,因为您有两组相互参数。在这种情况下,您有2x2 = 4个参数集。让我们假设您没有2组而是3组2个参数。这导致2x2x2 = 8个必要的ParameterSets。这意味着每个参数至少有8行 - > 6x8 = 48行仅用于声明部分。没有提到为每个参数正确分配正确的ParameterSets的浓度。对于像这样的简单语法,不存在更好的方法:
( - a | -b)( - c | -d)( - e | -f)...
修改强>: 这里澄清了我想要实现的内容:
Param(
[string]$a1="some value to create a2",
[PsObject]$a2,
[string]$b1="some value to create a2",
[PsObject]$b2,
[string]$c1="some value to create a2",
[PsObject]$c2,
)
对于我的功能,应该提供(a1或a2)和(b1或b2)和(c1或c2)。因为a2,b2和c3可以通过默认值a1,b1和c1创建,所有带有n2的参数(其中n = a或b或c)应该是可选的(Mandatory = false)。因为我有n1的默认值(其中n = a或b或c),它们也不是强制性的。
回到我原来的问题: 我可以为参数输入可能性的每个排列构建ParameterSets。这将导致我的工作有很多不同的参数。
示例:
Param(
[Parameter(Position=0)]
[Parameter(ParameterSetName="a1b1c1", Mandatory=$false)]
[Parameter(ParameterSetName="a1b1c2", Mandatory=$false)]
[Parameter(ParameterSetName="a1b2c1", Mandatory=$false)]
[Parameter(ParameterSetName="a1b2c2", Mandatory=$false)]
[string]$a1="some value to create a2",
[Parameter(Position=0)]
[Parameter(ParameterSetName="a2b1c1", Mandatory=$false)]
[Parameter(ParameterSetName="a2b1c2", Mandatory=$false)]
[Parameter(ParameterSetName="a2b2c1", Mandatory=$false)]
[Parameter(ParameterSetName="a2b2c2", Mandatory=$false)]
[PsObject]$a2,
[Parameter(Position=1)]
[Parameter(ParameterSetName="a1b1c1", Mandatory=$false)]
[Parameter(ParameterSetName="a1b1c2", Mandatory=$false)]
[Parameter(ParameterSetName="a2b1c1", Mandatory=$false)]
[Parameter(ParameterSetName="a2b1c2", Mandatory=$false)]
[string]$b1="some value to create a2",
[Parameter(Position=1)]
[Parameter(ParameterSetName="a1b2c1", Mandatory=$false)]
[Parameter(ParameterSetName="a1b2c2", Mandatory=$false)]
[Parameter(ParameterSetName="a2b2c1", Mandatory=$false)]
[Parameter(ParameterSetName="a2b2c2", Mandatory=$false)]
[PsObject]$b2,
[Parameter(Position=2)]
[Parameter(ParameterSetName="a1b1c1", Mandatory=$false)]
[Parameter(ParameterSetName="a1b2c1", Mandatory=$false)]
[Parameter(ParameterSetName="a2b1c1", Mandatory=$false)]
[Parameter(ParameterSetName="a2b2c1", Mandatory=$false)]
[string]$c1="some value to create a2",
[Parameter(Position=2)]
[Parameter(ParameterSetName="a1b1c2", Mandatory=$false)]
[Parameter(ParameterSetName="a1b2c2", Mandatory=$false)]
[Parameter(ParameterSetName="a2b1c2", Mandatory=$false)]
[Parameter(ParameterSetName="a2b2c2", Mandatory=$false)]
[PsObject]$c2,
)
您可以轻松地看到它与第一篇文章相比有多复杂和多长。然而,由于所有Mandatory = false参数,它甚至无法工作。
有什么建议可以实现我的目标吗?
答案 3 :(得分:0)
Steve B的答案是我一直在寻找的东西,但是由于代码示例(param1 / 2 A / B / C / D)的抽象性质,尝试实现它令人困惑。一旦理解了这个概念,为变量和参数集提供有意义的名称确实可以帮助我了解发生了什么。所以我想我会分享一个更具体的例子,以防它对别人有帮助。
说您要点餐。您可以选择百事可乐或可乐作为饮品(互斥选择#1)。您可以选择汉堡配薯条或沙拉作为主菜(互斥选择#2)。为此,我要说的是给定值只是食品的整数大小,但这无关紧要。
param (
[Parameter(Position=0,Mandatory=$true,ParameterSetName="Pepsi-BurgerFries")]
[Parameter(Position=0,Mandatory=$true,ParameterSetName="Pepsi-Salad")]
[int]$Pepsi,
[Parameter(Position=0,Mandatory=$true,ParameterSetName="Coke-BurgerFries")]
[Parameter(Position=0,Mandatory=$true,ParameterSetName="Coke-Salad")]
[int]$Coke,
[Parameter(Mandatory=$true,ParameterSetName="Pepsi-BurgerFries")]
[Parameter(Mandatory=$true,ParameterSetName="Coke-BurgerFries")]
[int]$Burger,
[Parameter(Mandatory=$true,ParameterSetName="Pepsi-BurgerFries")]
[Parameter(Mandatory=$true,ParameterSetName="Coke-BurgerFries")]
[int]$Fries,
[Parameter(Mandatory=$true,ParameterSetName="Pepsi-Salad")]
[Parameter(Mandatory=$true,ParameterSetName="Coke-Salad")]
[int]$Salad
)