Powershell参数条件

时间:2016-02-23 23:51:59

标签: powershell parameters

function test{
    [cmdletBinding()]
    param(
        [Parameter(Position=0,Mandatory=$true)] [string]$Age, 
        [Parameter(Position=1,Mandatory=$true)] [string]$Sex, 
        [Parameter(Position=2,Mandatory=$true)] [string]$Location,
        [Parameter(Mandatory=$false)][ValidateSet("True","False")][string]$Favorite
        [Parameter(Mandatory=$false)[string]$FavoriteCar
    )

}

让我们说前三个参数是必需的,但不是第四个和第五个。对于$ Favorite,我只能传递true或false,但默认情况下它是$ false但是如果我传递true,我希望$ favoriteCar设置为$ true。

1 个答案:

答案 0 :(得分:1)

function test{
    [cmdletBinding(DefaultParameterSetName = 'all')]
    param(
        [Parameter(Position=0,Mandatory=$true)] [string]$Age, 
        [Parameter(Position=1,Mandatory=$true)] [string]$Sex, 
        [Parameter(Position=2,Mandatory=$true)] [string]$Location,
        [Parameter(ParameterSetName='Extra',Mandatory=$true)][bool]$Favorite,
        [Parameter(ParameterSetName='Extra',Mandatory=$true)][string]$FavoriteCar
    )


    if ($PSCmdlet.ParameterSetName -eq 'extra')
    {
        if($Favorite)
        {
            Write-Host ('age:{0}, sex: {1}, location: {2}, favcar: {3}' -f $age ,$sex, $Location,$FavoriteCar)
        }
        else
        {
            'nothing'
        }

    }
    else
    {
        Write-Host ('age:{0}, sex: {1}, location: {2}' -f $age ,$sex, $Location)
    }

}

您不需要执行[ValidateSet("True","False")][switch]因为[switch]始终评估为布尔值。true如果存在,则为false

如果未指定默认参数集名称,PS将默认为在参数上找到的ParameterSetName,在这种情况下为extra,并将提示您输入必需的favcar参数。当然没有指定all个参数,但是我们设置了它,所以默认情况下PS dosent尝试运行extra ParameterSet。

修改

在下面的命令中,因为未使用参数$favorite\$favoritecar PS将不会提示您输入任何值。

test -Age 10 -Sex female -Location Moon

输出:

age:10, sex: female, location: Moon

以下将强制PS使用参数集'额外'并提示您输入参数$favoritecar的值,因为它在参数集中是必需的'额外'。

test -Age 10 -Sex female -Location Moon -favorite $true

下面仍会提示您输入$favoritecar参数,因为它是强制性的,但由于代码中的if条件,不会处理任何内容。

test -Age 10 -Sex female -Location Moon -Favorite $false -FavoriteCar Ferrari

输出:

nothing