我正在PowerShell 3.0中编写一个函数。应根据另一个参数的值将函数中的一个参数设置为强制参数。
函数声明如下:
function removeVolumeandArrayFromHost(){
Param( [Parameter(mandatory = $true)] [ValidateSet('iSCSI','FC')] $arrayType, ##IpAddress/Name of the target host
[Parameter(mandatory = $true)] $volumeName, ##Name of the volume to be disconnected. (Volume name as in the array.)
[Parameter(mandatory = $false)] $FCACL, ##Access control list name to which volume is added (Related to FC Array only)
## Work with the parameters given.
}
在上面的函数中,参数'$ arrayType'的值可以是'iSCSI'或'FC'。
仅当$ arrayTpe ='FC'时,参数$ FCACL才是强制性的(强制= $ true)。如果$ arrayType ='iSCSI',那么$ FCACL参数不应该是强制性的(强制= $ false)
我尝试使用参数名称但它有点帮助,因为我需要查看参数$ arrayType的值来决定$ FCACL是否是强制性的。
任何类型的帮助或指针都将受到高度赞赏。
提前多多感谢。 :)
答案 0 :(得分:2)
您可以使用动态参数,或者如果将$arrayType
变量更改为开关,则可以使用ParameterSetName
强制执行。事情变成这样:
Function removeVolumeandArrayFromHost(){
Param(
[Parameter(ParameterSetName="FC")][switch]$FC,
[Parameter(ParameterSetName="iSCSI")][switch]$iSCSI,
[Parameter(ParameterSetName="FC",Mandatory=$true)] [string]$FCACL,
[Parameter(mandatory = $true)] [string]$volumeName
)
....
## Work with the parameters given.
}
或者,如果您知道您只处理FC或iSCSI,那么您只需要一个switch语句来说明它是否为FC。如果存在-FC
开关,则它将调用ParameterSetName=FC
并需要-FCACL
参数。如果您排除-FC
开关,则认为它是iSCSI,ParameterSetName
将确保您不需要-FCACL
。
Function removeVolumeandArrayFromHost(){
Param(
[Parameter(ParameterSetName="FC")][switch]$FC,
[Parameter(ParameterSetName="FC",Mandatory=$true)] [string]$FCACL,
[Parameter(mandatory = $true)] [string]$volumeName
)
....
## Work with the parameters given.
}
答案 1 :(得分:0)
一个选项是使用函数的Begin / Process / End部分并在" Begin"中处理这类内容。部分,而不是像其他答案所建议的那样添加动态参数。
答案 2 :(得分:0)
Chris N给出的建议完全适用于我的情况,因为我不得不以这种方式处理一个参数。我的理解是,如果处理许多这样的参数,动态参数将是更好的选择。
我在这里添加代码更加清晰。
function removeVolumeandArrayFromHost(){
Param( [Parameter(mandatory = $true)] [ValidateSet('iSCSI','FC')] $arrayType, ##IpAddress/Name of the target host
[Parameter(mandatory = $true)] $volumeName, ##Name of the volume to be disconnected. (Volume name as in the array.)
[Parameter(mandatory = $false)] $FCACL) ##Access control list name to which volume is added (Related to FC Array only)
begin{
if (($arrayType -eq 'FC') -and ($FCACL -eq $null)){
Write-Error "For a FC Array, the FCACL parameter cannot be null."
return
}
}
process{
.....
.....
}
}
谢谢大家的意见和建议。我感谢您的帮助。