2015-05-12 4 views
8

Я создаю функцию, которая будет иметь 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 становятся обязательными, но не тогда, когда они используются сами по себе.

Любые предложения о том, как сделать эту работу?

+0

Я в настоящее время разбора все это, но то, что действительно помогает в использовании наборов параметров можно использовать 'Get-Help' на свои функции, чтобы показать вам, как PowerShell интерпретирует ваши наборы параметров , Если бы вы могли сделать это для каждой из сконфигурированных вами конфигураций, а затем отредактировать вывод в своем ответе, это было бы очень полезно. – briantist

+0

Большой вопрос, спасибо! –

ответ

12

Хорошо, я так понимаю. Возможные комбинации, которые вы хотите являются:

  1. -RetainGroups
  2. -RemoveFromAllGroups
  3. -RetainGroups плюс -TransferHomeDrive
  4. -RemoveFromAllGroups плюс -TransferHomeDrive
  5. Только -UserName
  6. -UserName плюс -TransferHomeDrive

Я предполагаю, что -OldServer и -NewServer применяются только при перемещении домашнего привода, поэтому всякий раз, когда вы перемещаете домашний привод, они являются обязательными. Если это не так, дайте мне знать.

Итак, у вас есть 6 наборов параметров. Так же, как и параметр magichell, установленный в параметрах powershell, нет хорошего способа сказать, что «эти 2 переключателя являются взаимоисключающими, но также должны быть доступны во всех наборах параметров», поэтому вам нужно их мультиплексировать и повторять каждый набор параметров с помощью одного или Другие.

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

Упрощая It

Если вы хотите, чтобы сделать его менее сложной, вы могли бы рассмотреть консолидации удалить и сохранить переключатели в один параметр, примерно такой:

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

I хочу отметить, что, хотя это проще для , определите, что не означает, что это bett э. Возможно, вы хотите оптимизировать свои наборы параметров для вызывающего , что может быть особенно важно, если это функция, которую вы планируете использовать в интерактивном режиме из оболочки, вместо того, чтобы звонить из других скриптов (и похоже, что это может это так).

Так что добавление некоторой сложности в определение, чтобы упростить его использование, может быть правильным.

+0

Ну, теперь я не выгляжу глупо, ты написал почти такой же ответ, как мне (плюс больше) почти за 45 минут до меня. Хотел бы я увидеть это, прежде чем я представила свой ответ. – TheMadTechnician

+0

Эх, это случается со всеми нами в какой-то момент, @ TheMadTechnician.:) – briantist

+2

Это лучшее объяснение наборов параметров PowerShell, которые я видел в Интернете. Этот ответ намного лучше, чем стандартные страницы MSDN. –

7

Добавив еще два набора параметров, вы можете делать то, что хотите. Это необходимо, потому что у вас есть 3 набора сейчас, плюс не заданный параметр (который технически помещает его в набор __AllParameterSets, если я правильно помню). Так что это 4 способа сделать это. Вам нужно 6 способов сделать это, если я правильно прочитаю ваш вопрос. Вы хотите, чтобы все следующие варианты:

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> -OldServer <string> -NewServer <string> [-TransferHomeDrive] [<CommonParameters>] 

Таким образом, мы добавим RemoveFromAllGroupsWTran и RetainGroupsWTran параметр устанавливает, добавьте их обоих $TransferHomeDrive, $OldServer и $NewServer (удаление другие связанные с этим набором имен из них), то добавьте каждый к соответствующему параметру переключателя. Он заканчивает тем, как это:

function Move-AccountOut { 

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

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

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

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

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

     [Parameter(ParameterSetName='TransferHomeDrive', Mandatory=$True)] 
     [Parameter(ParameterSetName='RetainGroupsWTran')] 
     [Parameter(ParameterSetName='RemoveFromAllGroupsWTran')] 
     [string]$NewServer 
    ) 
} 
Смежные вопросы