参数集不是必需的

时间:2017-04-27 10:15:13

标签: powershell

两个参数$ installDatabase和$ databasePassword:

[Parameter(ParameterSetName='Test', mandatory=$false)][Switch]$installDatabase,
[Parameter(ParameterSetName='Test')][String]$databasePassword

如果符合以下条件,我需要执行与此相同的功能:

if ($installDatabase -and !($databasePassword) -or ($databasePassword -and !($installDatabase)))
{ 
Write-Verbose "Use -installDatabase and -databasePassword together."
}

ParameterSet有什么问题?

3 个答案:

答案 0 :(得分:1)

function Do-Something{    
    Param(
        [Parameter(ParameterSetName='Test', Mandatory=$true)]
        [Switch]$installDatabase,

        [Parameter(ParameterSetName='Test', Mandatory=$true)]
        [String]$databasePassword
    )
}
]

之前缺少

[String]

答案 1 :(得分:1)

(在PS v5上测试)

似乎参数集仅在定义了至少两个时才起作用 - 但是,不是引发异常而是提示用户提供缺失值(因为Mandatory=$True),这可能不是您想要的

如果Param定义更改为:

Param(
[Parameter(ParameterSetName='Test1', Mandatory=$True)]
[Switch]$installDatabase,

[Parameter(ParameterSetName='Test1', Mandatory=$True)]
[String]$databasePassword,

[Parameter(ParameterSetName='Test2')]
[String]$something
)

如果只提供了其中一个,系统会提示用户installDatabasedatabasePassword,如果提供something则不会提示用户。

如果提供了something和(installDatabasedatabasePassword),则会引发异常。

如果只定义了一个参数集,那就好像没有。

修改

尝试对可选参数使用默认值($throw...),例如:

[Parameter(ParameterSetName='Test1')]
[Switch]$installDatabase=$(throw "installDatabase is mandatory if databasePassword is provided"),

不起作用,因为无论参数集是否适用,都会使用默认值。

答案 2 :(得分:1)

编辑:确定这是一个评估参数集的版本

function test
{
    [CmdletBinding(DefaultParameterSetName="Test")]
    param(
        [Parameter(ParameterSetName='Test', mandatory=$true)]
        [switch]$installDatabase,
        [Parameter(ParameterSetName='Test2', mandatory=$true)]
        [String]$databasePassword
    )
}

在此版本中,您可以拨打test -installDatabasetest -databasePassword pwd 或发生以下异常:

test : Parameter set cannot be resolved using the specified named parameters.