【问题标题】:Powershell: Seemingly valid parameter set doesn't workPowershell:看似有效的参数集不起作用
【发布时间】:2015-05-23 04:53:21
【问题描述】:

我正在整理一套用于内部帐户管理的工具。此特定 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 输出,它似乎是一个有效的参数集。

【问题讨论】:

  • 尝试跟踪:Trace-Command -Name ParameterBinding -Expression { Move-AccountOut -Username X -TransferHomeDrive -OldServer X -NewServer Y } -PSHost 并发布输出。

标签: powershell


【解决方案1】:

感谢您的输出,这是关键(重点是我的):

剩余的有效参数集: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 参数集中强制它们,但上面没有显示。

【讨论】:

  • 谢谢!这似乎可以解决问题,但有一个怪癖:当我单独使用 -TransferHomeDrive 运行 cmdlet 时,它仍然会引发模棱两可的参数集错误。当我使用-OldServer-NewServer 运行它时,它运行正常吗?新的 pastebin:pastebin.com/bvm86Qac
  • -OldServer-NewServer 对于 TransferHomeDrive 参数集是必需的。我想我记得在你的另一个问题中,我根据你写的内容做出了这个假设,但我不确定。只要这些参数在该集中是强制性的,您就需要指定它们。您可以将它们设为可选(仅在 TransferHomeDrive 中),应该可以,但我还没有确定是否会有任何副作用。
猜你喜欢
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 2020-05-02
  • 2015-04-26
  • 2016-05-07
  • 1970-01-01
相关资源
最近更新 更多