仅在存在其他开关时才允许切换参数

时间:2015-07-08 22:08:28

标签: powershell

我有一个带2个开关的功能,如果另一个有,只需要一个。目前,如果第二个开关本身运行,没有任何反应,这很好,但我认为我可以做得更好。我想设置它,以便第二个参数只有在第一个参数也存在时才能出现。我试过制作第一个必需的,技术上有用,但没有给出我期待的结果(模糊的参数设置错误)。

这是我的参数声明:

[CmdletBinding(DefaultParameterSetName='NoTransferMDrive')]
Param( 
    [Parameter(Mandatory=$True, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)]
    [string]$Username,

    [switch]$RemoveFromAllGroups,

    [switch]$NoConfirmationPrompt,

    [Parameter(ParameterSetName='TransferMDrive')]
    [switch]$TransferMDrive,

    [Parameter(ParameterSetName='TransferMDrive', Mandatory=$True)]
    [string]$OldServer,

    [Parameter(ParameterSetName='TransferMDrive', Mandatory=$True)]
    [string]$NewServer
)

我修改了param语句,如下所示:

[CmdletBinding(DefaultParameterSetName='NoTransferMDrive')]
Param( 
    [Parameter(Mandatory=$True, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)]
    [string]$Username,

    [Parameter(ParameterSetName='RemoveFromGroups',Mandatory=$True)]
    [switch]$RemoveFromAllGroups,

    [Parameter(ParameterSetName='RemoveFromGroups')]
    [switch]$NoConfirmationPrompt,

    [Parameter(ParameterSetName='RemoveFromGroups')]
    [Parameter(ParameterSetName='TransferMDrive')]
    [switch]$TransferMDrive,

    [Parameter(ParameterSetName='RemoveFromGroups')]
    [Parameter(ParameterSetName='TransferMDrive', Mandatory=$True)]
    [string]$OldServer,

    [Parameter(ParameterSetName='RemoveFromGroups')]
    [Parameter(ParameterSetName='TransferMDrive', Mandatory=$True)]
    [string]$NewServer
)

它会提示我输入-RemoveFromAllGroups的值,但如果我将其留空,我会得到以下内容:

Do-Something : Cannot process argument transformation on parameter 'RemoveFromAllGroups'. Cannot convert value "System.String" to type "System.Management.Automation.SwitchParameter". 
Boolean parameters accept only Boolean values and numbers, such as $True, $False, 1 or 0.
At line:27 char:1
+ Do-Something -NoConfirmationPrompt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Do-Something], ParameterBindingArgumentTransformationException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,Do-Something

如果可能,我希望它立即失败,如果-RemoveFromAllGroups自己通过,则不会提示-NoPromptForConfirmation的值。我可以改变什么来使这项工作?

1 个答案:

答案 0 :(得分:4)

通常情况下,我会告诉您,您正在通过避免让它提示强制参数来反对PowerShell。但PowerShell不能很好地处理强制切换参数的提示。这是获得您要求的方式:

function test {
    [CmdletBinding(DefaultParameterSetName='NoTransferMDrive')]
    Param( 
        [Parameter(Mandatory=$True, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)]
        [string]$Username,

        [Parameter(ParameterSetName='RemoveFromGroups')]
        [switch]$RemoveFromAllGroups,

        [Parameter(ParameterSetName='RemoveFromGroups')]
        [switch]$NoConfirmationPrompt,

        [Parameter(ParameterSetName='RemoveFromGroups')]
        [Parameter(ParameterSetName='TransferMDrive')]
        [switch]$TransferMDrive,

        [Parameter(ParameterSetName='RemoveFromGroups')]
        [Parameter(ParameterSetName='TransferMDrive', Mandatory=$True)]
        [string]$OldServer,

        [Parameter(ParameterSetName='RemoveFromGroups')]
        [Parameter(ParameterSetName='TransferMDrive', Mandatory=$True)]
        [string]$NewServer
    )

    begin {
        if ($NoConfirmationPrompt -and !$RemoveFromAllGroups) {
            throw "If -NoConfirmationPrompt is specified, you must also specify -RemoveAllGroups"
        }
        "Username is $username, RemoveFromAllGroups is $RemoveFromAllGroups"
    } 
}

test -Username johndoe -OldServer foo -NewServer bar -NoConfirmationPrompt

但是如果没有传递-NoConfirmationPrompt,那么期望的行为是什么? -RemoveFromAllGroups仍然需要吗?也许不是。如果您没有传入此开关,那么它将使用TransferMDrive参数集。如果PowerShell看到-RemoveFromAllGroups,那么它知道它正在使用RemoveFromGroups参数集。