【发布时间】:2015-07-24 00:54:39
【问题描述】:
我正在构建一个具有三个不同参数集的函数,其中两个参数集与第三个参数集重叠。选项如下所示:
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,它将调用一个函数来使用内部工具安排传输。
换句话说,RetainGroups 和RemoveFromAllGroups 应该是所有参数集的成员(类似于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
)
}
使用这种技术,retain 和 remove 不能一起使用,但 OldServer 和 NewServer 不再是强制性的。如果我将它们更改为:
[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
)
}
那么OldServer 和NewServer 将是强制性的,但RetainGroups 和RemoveFromAllGroups 可以一起使用。此外,如果我同时使用 retain 和 remove,那么 OldServer 和 NewServer 将成为强制性的,但单独使用时则不会。
我该如何进行这项工作?
【问题讨论】:
-
我目前正在解析所有这些,但真正有助于使用参数集的是在您的函数上使用
Get-Help以向您展示 PowerShell 如何解释您的参数集。如果您可以为您尝试过的每个配置执行此操作,然后将输出编辑到您的答案中,那将非常有帮助。 -
好问题,谢谢!
标签: powershell