Я создаю функцию, которая будет иметь 3 различных набора параметров, 2 из этих наборов будут перекрываться с третьим. Эти варианты будут выглядеть следующим образом:Powershell: Множество наборов параметров
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
)
}
Используя эту технику, сохранить и удалить не могут быть использованы вместе, но 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
становятся обязательными, но не тогда, когда они используются сами по себе.
Любые предложения о том, как сделать эту работу?
Я в настоящее время разбора все это, но то, что действительно помогает в использовании наборов параметров можно использовать 'Get-Help' на свои функции, чтобы показать вам, как PowerShell интерпретирует ваши наборы параметров , Если бы вы могли сделать это для каждой из сконфигурированных вами конфигураций, а затем отредактировать вывод в своем ответе, это было бы очень полезно. – briantist
Большой вопрос, спасибо! –