Я строю функцию, которая будет иметь три различных набора параметров, и два из этих наборов будут перекрываться с третьим. Параметры будут выглядеть так:
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
словами, 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
)
}
Используя эту технику, сохранить и удалить нельзя использовать вместе, но 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
могут использоваться вместе. Кроме того, если я использую функции сохранения и удаления вместе, то OldServer
и NewServer
становятся обязательными, но не тогда, когда они используются по отдельности.
Как мне сделать эту работу?