Powershell:看似有效的参数集不起作用

时间:2015-05-22 20:20:49

标签: powershell

我正在整理一套内部帐户管理工具。此特定cmdlet将为转出帐户准备帐户,其中包括删除或保留其组的选项。我的Param语句变得非常冗长,最终有6个参数集来涵盖每个场景。除一个参数外,所有参数组合都有效。这是我的代码:

function Move-AccountOut {

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

        [Parameter(ParameterSetName='RetainGroups',Position=2)]
        [Parameter(ParameterSetName='RetainGroupsWTran',Position=2)]
        [switch]$RetainGroups,

        [Parameter(ParameterSetName='RemoveFromAllGroups',Position=2)]
        [Parameter(ParameterSetName='RemoveFromAllGroupsWTran',Position=2)]
        [switch]$RemoveFromAllGroups,

        [Parameter(ParameterSetName='TransferHomeDrive', Position=3)]
        [Parameter(ParameterSetName='RetainGroupsWTran', Position=3)]
        [Parameter(ParameterSetName='RemoveFromAllGroupsWTran', Position=3)]
        [switch]$TransferHomeDrive,

        [Parameter(ParameterSetName='TransferHomeDrive', Mandatory=$True, Position=4)]
        [Parameter(ParameterSetName='RetainGroupsWTran', Mandatory=$True, Position=4)]
        [Parameter(ParameterSetName='RemoveFromAllGroupsWTran', Mandatory=$True, Position=4)]
        [string]$OldServer,

        [Parameter(ParameterSetName='TransferHomeDrive', Mandatory=$True, Position=5)]
        [Parameter(ParameterSetName='RetainGroupsWTran', Mandatory=$True, Position=5)]
        [Parameter(ParameterSetName='RemoveFromAllGroupsWTran', Mandatory=$True, Position=5)]
        [string]$NewServer
    )
}

这将生成以下Get-Help输出:

Move-AccountOut [-Username] <string>  [<CommonParameters>]

Move-AccountOut [-Username] <string> [[-RetainGroups]] [[-TransferHomeDrive]] [-OldServer] <string> [-NewServer] <string>  [<CommonParameters>]

Move-AccountOut [-Username] <string> [[-RetainGroups]]  [<CommonParameters>]

Move-AccountOut [-Username] <string> [[-RemoveFromAllGroups]] [[-TransferHomeDrive]] [-OldServer] <string> [-NewServer] <string>  [<CommonParameters>]

Move-AccountOut [-Username] <string> [[-RemoveFromAllGroups]]  [<CommonParameters>]

Move-AccountOut [-Username] <string> [[-TransferHomeDrive]] [-OldServer] <string> [-NewServer] <string>  [<CommonParameters>]

我遇到问题的参数是底部参数(仅限传输)。我可以使用用户名,用户名+保留,用户名+删除,用户名+保留+转移和用户名+删除+转移来运行命令。但是没有保留或删除的转移不起作用。运行时,它会抛出以下错误:

Move-AccountOut : Parameter set cannot be resolved using the specified named parameters.
At line:33 char:1
+ Move-AccountOut -Username X -TransferHomeDrive -OldServer X -NewServer Y
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Move-AccountOut], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,Move-AccountOut

我无法弄清楚为什么,因为根据我的Get-Help输出,它似乎是一个有效的参数集。

1 个答案:

答案 0 :(得分:2)

感谢您输出,这是关键(强调我的):

  

剩余的有效参数集: RetainGroupsWTran
  剩余的有效参数集: RemoveFromAllGroupsWTran
  剩余的有效参数集: TransferHomeDrive

在绑定了所有参数后会发生这种情况,并显示剩余3个有效参数集。

TransferHomeDrive 是您想要的参数集。

那么为什么其他的呢?

RetainGroupsWTran 只有在指定-RetainGroups时才能 RemoveFromAllGroupsWTran 只能如果指定-RemoveFromAllGroups,则可能。

但是,您还可以在Get-Help输出中看到没有参数设置,这些开关是必需的,这就是问题所在。

您的更新定义如下所示:

function Move-AccountOut {

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

        [Parameter(ParameterSetName='RetainGroups',Position=2)]
        [Parameter(Mandatory=$true,ParameterSetName='RetainGroupsWTran',Position=2)]
        [switch]$RetainGroups,

        [Parameter(ParameterSetName='RemoveFromAllGroups',Position=2)]
        [Parameter(Mandatory=$true,ParameterSetName='RemoveFromAllGroupsWTran',Position=2)]
        [switch]$RemoveFromAllGroups,

        [Parameter(ParameterSetName='TransferHomeDrive', Position=3)]
        [Parameter(ParameterSetName='RetainGroupsWTran', Position=3)]
        [Parameter(ParameterSetName='RemoveFromAllGroupsWTran', Position=3)]
        [switch]$TransferHomeDrive,

        [Parameter(ParameterSetName='TransferHomeDrive', Mandatory=$True, Position=4)]
        [Parameter(ParameterSetName='RetainGroupsWTran', Mandatory=$True, Position=4)]
        [Parameter(ParameterSetName='RemoveFromAllGroupsWTran', Mandatory=$True, Position=4)]
        [string]$OldServer,

        [Parameter(ParameterSetName='TransferHomeDrive', Mandatory=$True, Position=5)]
        [Parameter(ParameterSetName='RetainGroupsWTran', Mandatory=$True, Position=5)]
        [Parameter(ParameterSetName='RemoveFromAllGroupsWTran', Mandatory=$True, Position=5)]
        [string]$NewServer
    )
}

我已经在跟踪输出中显示的参数集中强制使用它们。

我认为您也应该在RetainGroupsRemoveFromAllGroups参数集中强制使用它们,但上面没有显示它。