gpt4 book ai didi

powershell - 多个参数集和PowerShell

转载 作者:行者123 更新时间:2023-12-03 12:10:38 27 4
gpt4 key购买 nike

我正在构建一个具有三个不同参数集的函数,其中两个参数集将与第三个参数集重叠。选项如下所示:

A B
A C
A (D E F)
A B (D E F)
A C (D E F)

为了更清楚一点,下面是该函数的部分完成版本:

function Move-AccountOut {

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

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

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

[Parameter(ParameterSetName='TransferHomeDrive', Mandatory=$False)]
[switch]$TransferHomeDrive,

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

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

该功能的目的是使将AD帐户转出到公司内另一个位置的过程自动化。设置时, RetainGroups将自动保留用户组,而 RemoveFromAllGroups将自动将用户从其组中删除。这两个开关不能同时使用。此外,如果设置了 TransferHomeDrive,它将调用一个函数以使用内部工具安排传输。

换句话说, RetainGroupsRemoveFromAllGroups应该是所有参数集的成员(类似于 Username),但不能一起使用。

我尝试了两种方法。首先:

function Move-AccountOut {

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

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

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

[Parameter(ParameterSetName='TransferHomeDrive', Mandatory=$False)]
[Parameter(ParameterSetName='RetainGroups')]
[Parameter(ParameterSetName='RemoveFromAllGroups')]
[switch]$TransferHomeDrive,

[Parameter(ParameterSetName='TransferHomeDrive', Mandatory=$True)]
[Parameter(ParameterSetName='RetainGroups')]
[Parameter(ParameterSetName='RemoveFromAllGroups')]
[string]$OldServer,

[Parameter(ParameterSetName='TransferHomeDrive', Mandatory=$True)]
[Parameter(ParameterSetName='RetainGroups')]
[Parameter(ParameterSetName='RemoveFromAllGroups')]
[string]$NewServer
)
}

使用此技术,保留和删除不能一起使用,但是 OldServerNewServer不再是必需的。如果我将其更改为:

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

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

它们将是强制性的,但不再关心是否设置了 TransferHomeDrive

如果我以相反的方式设置它:

function Move-AccountOut {

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

[Parameter(ParameterSetName='RetainGroups')]
[Parameter(ParameterSetName='TransferHomeDrive')]
[switch]$RetainGroups,

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

[Parameter(ParameterSetName='TransferHomeDrive', Mandatory=$False)]
[switch]$TransferHomeDrive,

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

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

然后 OldServerNewServer将是强制性的,但是 RetainGroupsRemoveFromAllGroups可以一起使用。另外,如果我同时使用保留和删除,那么 OldServerNewServer成为强制性的,但是当它们单独使用时不是强制性的。

我该如何工作?

最佳答案

好吧,我想我明白了。您想要的可能组合是:

  • -RetainGroups
  • -RemoveFromAllGroups
  • -RetainGroups加上-TransferHomeDrive
  • -RemoveFromAllGroups加上-TransferHomeDrive
  • -UserName
  • -UserName加上-TransferHomeDrive

  • 我假设 -OldServer-NewServer仅在移动主驱动器时适用,因此无论何时移动主驱动器,它们都是必需的。如果不是这种情况,请告诉我。

    因此,这里有6个参数集。像powershell的参数集魔术一样强大,没有一种好方法可以说“这两个开关是互斥的,但也应该在所有参数集中都可用”,因此您必须对其进行多路复用,并用一个或一个重复每个参数集。其他。

    function Move-AccountOut {
    [CmdletBinding(DefaultParameterSetName='OnlyUser')]
    Param(
    [Parameter(
    Mandatory=$True,
    ValueFromPipeline=$True,
    ValueFromPipelineByPropertyName=$True
    )]
    [string]
    $Username,

    [Parameter(
    Mandatory=$True,
    ParameterSetName='RetainOnly'
    )]
    [Parameter(
    Mandatory=$True,
    ParameterSetName='RetainAndTransfer'
    )]
    [switch]
    $RetainGroups,

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

    [Parameter(
    Mandatory=$True,
    ParameterSetName='RetainAndTransfer'
    )]
    [Parameter(
    Mandatory=$True,
    ParameterSetName='RemoveAndTransfer'
    )]
    [Parameter(
    Mandatory=$True,
    ParameterSetName='TransferOnly'
    )]
    [switch]
    $TransferHomeDrive,

    [Parameter(
    Mandatory=$True,
    ParameterSetName='RetainAndTransfer'
    )]
    [Parameter(
    Mandatory=$True,
    ParameterSetName='RemoveAndTransfer'
    )]
    [Parameter(
    Mandatory=$True,
    ParameterSetName='TransferOnly'
    )]
    [string]
    $OldServer,

    [Parameter(
    Mandatory=$True,
    ParameterSetName='RetainAndTransfer'
    )]
    [Parameter(
    Mandatory=$True,
    ParameterSetName='RemoveAndTransfer'
    )]
    [Parameter(
    Mandatory=$True,
    ParameterSetName='TransferOnly'
    )]
    [string]
    $NewServer
    )

    }
    Get-Help Move-AccountOut的输出:

    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>]


    简化它

    如果您希望减轻它的难度,可以考虑将remove和keep开关合并为一个参数,如下所示:

    [Parameter(
    Mandatory=$false # you can leave this out
    )]
    [ValidateSet(
    'None',
    'Retain',
    'RemoveAll'
    )]
    [String]
    $GroupAction = 'None'

    这会将参数集减少到2,并使整个定义如下所示:

    function Move-AccountOut {
    [CmdletBinding(DefaultParameterSetName='OnlyUser')]
    Param(
    [Parameter(
    Mandatory=$True,
    ValueFromPipeline=$True,
    ValueFromPipelineByPropertyName=$True
    )]
    [string]
    $Username,

    [ValidateSet(
    'None',
    'Retain',
    'RemoveAll'
    )]
    [String]
    $GroupAction = 'None' ,

    [Parameter(
    Mandatory=$True,
    ParameterSetName='TransferOnly'
    )]
    [switch]
    $TransferHomeDrive,

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

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

    }

    使用以下 Get-Help输出:

    Move-AccountOut -Username <string> [-GroupAction <string> {None | Retain | RemoveAll}]  [<CommonParameters>]

    Move-AccountOut -Username <string> -TransferHomeDrive -OldServer <string> -NewServer <string> [-GroupAction <string> {None | Retain | RemoveAll}] [<CommonParameters>]


    我确实要指出,尽管定义起来比较简单,但这并不意味着会更好。可能是您想优化 调用者的参数集,如果这是您计划在 shell 中大量使用而不是从其他脚本进行调用的函数,则这可能尤其重要(看起来可能是这样)就是这种情况)。

    因此,在定义中增加一些复杂度以使其易于使用可能是正确的选择。

    关于powershell - 多个参数集和PowerShell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30202916/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com