电源外壳功能参数正确使用


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就是答案。

最新更新