PARAM (
[parameter(Mandatory=$true)]
[string]$Poolname,
[array]$Ports = 443,
[parameter(Mandatory=$true)]
[ValidateSet("ELB","ALB")]
$Loadbalncertype,
[parameter(Mandatory=$true)]
[ValidateSet("Ping","HTTPGet")]
$HealthCheckConfigType,
[parameter(Mandatory=$true)]
[array]$LBSubnets,
[parameter(Mandatory=$true)]
[string]$SecGroupID,
[int]$IdleTimeoutsec = 60,
[bool]$SSLPassthrough = $false,
string]$SSLCertificateName,
[string]$HealthCheckPath,
[string]$SSLPolicyName,
[bool]$ConfigureProxyProtocol = $true
)
在上面,我想仅在 $Loadbalncertype = ELB 时才使用参数 $HealthCheckConfigType。我不确定如何在Powershell函数参数部分中创建此逻辑。
为了在param
定义中做到这一点,您可以使用DynamicParam
来创建动态参数,但这需要大量工作,而且可能矫枉过正。
如果您必须将$LoadBalancerType
作为[string]
,我能想到的最直接的方法就是使用这样的[ValidateScript()]
:
param(
[ValidateSet("ELB","ALB")]
$LoadBalancerType ,
[ValidateScript( { $LoadBalancerType -eq 'ELB' } )]
[ValidateSet("Ping","HTTPGet")]
$HealthCheckConfigType
)
这将给出一个糟糕的错误消息,您可以使用放置良好的throw
覆盖该错误消息:
[ValidateScript( { $LoadBalancerType -eq 'ELB' -or $(throw 'A better error message') } )]
另一种选择是将$LoadBalancerType
参数更改为单独的交换机参数,并使用它们来定义参数集:
[CmdletBinding(DefaultParameterSet='ALB')]
param(
[parameter(Mandatory=$true)]
[string]$Poolname,
[Parameter(Mandatory, ParameterSetName = 'ALB')]
[Switch]$ALB ,
[Parameter(Mandatory, ParameterSetName = 'ELB')]
[Switch]$ELB ,
[Parameter(Mandatory, ParameterSetName = 'ELB')
[ValidateSet("Ping","HTTPGet")]
$HealthCheckConfigType
)
这允许参数解析器强制执行此限制,并且您可以通过在函数上调用Get-Help
在自动生成的参数集中看到它。
而且,即使这不是通常的方法,在您的情况下,如果您使用所需值的名称命名参数集,您也可以在没有条件的情况下重新创建$LoadBalancerType
:
$LoadBalancerType = $PSCmdlet.ParameterSetName
(当然,假设唯一可能的参数集是直接的负载均衡器名称;请注意这一点(
但是,如果你从来没有真正需要这个字符串值;也就是说,如果你只打算这样做:
if ($LoadBalancerType -eq 'ALB') {
} elseif ($LoadBalancerType -eq 'ELB') {
}
或类似的东西,那么你不需要重新创建它,只需做:
if ($ALB) {
} elseif ($ELB) {
}
或者,您根本不需要在param
块中进行此检查;您可以在函数体中进行检查,或者在适当的情况下begin
/process
块。
使用DynamicParam
块:https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_functions_advanced_parameters?view=powershell-6#dynamic-parameters
我自己对它们没有太多经验,但这是该 MS 文档中的代码示例。您可以处理和添加所需的任何参数:
function Get-Sample {
[CmdletBinding()]
Param ([String]$Name, [String]$Path)
DynamicParam
{
if ($path -match ".HKLM.:")
{
$attributes = New-Object -Type `
System.Management.Automation.ParameterAttribute
$attributes.ParameterSetName = "__AllParameterSets"
$attributes.Mandatory = $false
$attributeCollection = New-Object `
-Type System.Collections.ObjectModel.Collection[System.Attribute]
$attributeCollection.Add($attributes)
$dynParam1 = New-Object -Type `
System.Management.Automation.RuntimeDefinedParameter("dp1", [Int32],
$attributeCollection)
$paramDictionary = New-Object `
-Type System.Management.Automation.RuntimeDefinedParameterDictionary
$paramDictionary.Add("dp1", $dynParam1)
return $paramDictionary
}
}
}
另一种选择是不要弄脏DynamicParam
,在你的代码主体中,如果$LoadBalancerType
不等于ELB
,只需忽略$HealthCheckConfigType
,但如果你想使用参数验证器来检查这一点,DynamicParam
就是答案。