2015-05-12 17 views
8

Sto costruendo una funzione che avrà 3 set di parametri distinti, 2 di questi si sovrappongono al terzo. Le opzioni sarebbero simile a questa:PowerShell: set di parametri multipli

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

Per rendere un po 'più chiaro, qui è una versione parzialmente completato la funzione:

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 
    ) 
} 

Lo scopo della funzione è quella di automatizzare il processo di trasferimento un account AD in un'altra posizione all'interno dell'azienda. RetainGroups manterrà automaticamente i gruppi di utenti quando impostato, RemoveFromAllGroups rimuoverà automaticamente l'utente dai loro gruppi. I due interruttori non dovrebbero essere in grado di essere utilizzati insieme. Inoltre, se è impostato TransferHomeDrive, chiamerà una funzione per pianificare un trasferimento utilizzando uno strumento interno.

Per dirla in altro modo, e RetainGroupsRemoveFromAllGroups dovrebbe essere un membro di tutti gli insiemi di parametri (simili a Username), ma non dovrebbe essere in grado di essere utilizzati insieme.

Ho provato in due modi. Il primo:

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 
    ) 
} 

Usando questa tecnica, trattenere e rimuovere non possono essere utilizzati insieme, ma OldServer e NewServer non sono più obbligatori. Se li cambio a:

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

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

Saranno obbligatorio, ma non è più se ne frega se TransferHomeDrive è impostato.

Se ho impostato modo opposto:

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 
    ) 
} 

Poi OldServer e NewServer sarà obbligatoria, ma RetainGroups e RemoveFromAllGroups possono essere utilizzati insieme. Inoltre, se uso mantenere e rimuovere insieme, quindi OldServer e NewServer diventano obbligatori, ma non quando vengono utilizzati da soli.

Qualche suggerimento su come farlo funzionare?

+0

Attualmente sto parsing tutto questo, ma ciò che aiuta veramente a utilizzare set di parametri è quello di usare 'Get-help' sulle vostre funzioni per mostrare come PowerShell è interpretare i vostri set di parametri . Se tu potessi fare quello per ciascuna delle configurazioni che hai provato e quindi modificare l'output nella tua risposta, sarebbe davvero utile. – briantist

+0

Ottima domanda, grazie! –

risposta

12

Ok, penso di capirlo. Le combinazioni possibili che si desidera sono:

  1. -RetainGroups
  2. -RemoveFromAllGroups
  3. -RetainGroups più -TransferHomeDrive
  4. -RemoveFromAllGroups più -TransferHomeDrive
  5. Solo -UserName
  6. -UserName più -TransferHomeDrive

Suppongo che -OldServer e -NewServer si applichino solo quando si sposta l'unità di casa, quindi ogni volta che si sposta l'unità di casa, sono obbligatori. Se questo non è il caso, fammi sapere.

Quindi quello che hai qui sono 6 set di parametri. Per quanto potente sia il set di parametri di PowerShell magia, non c'è un buon modo per dire "questi 2 switch si escludono a vicenda ma dovrebbero essere disponibili anche in tutti i set di parametri" quindi devi multiplexarlo e ripetere ogni set di parametri con uno o altro.

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 
) 

} 

L'uscita del 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>] 

semplificandolo

Se si vuole rendere meno scoraggiante, si potrebbe prendere in considerazione il consolidamento del Rimuovere e conservare opzioni in un singolo parametro, qualcosa del genere:

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

Ciò ridurrebbe il vostro parametro imposta fino a 2, e rendere il vostro look intero definizione in questo modo:

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 
) 

} 

Con il Get-Help uscita seguente:

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 voglio sottolineare che anche se questo è più semplice per definire che non significa che è bett ER. Può essere che tu voglia ottimizzare i tuoi set di parametri per il chiamante che può essere particolarmente importante se questa è una funzione che prevedi di usare in modo interattivo molto dalla shell, piuttosto che chiamare da altri script (e sembra che questo possa sii il caso).

Quindi aggiungere una certa complessità nella definizione per renderlo più facile da usare potrebbe essere la cosa giusta da fare.

+0

Bene, ora non sembro sciocca, hai scritto praticamente la stessa risposta di me (e anche di più) quasi 45 minuti prima di me. Vorrei averlo visto prima di inviare la mia risposta. – TheMadTechnician

+0

Eh, capita a tutti noi ad un certo punto, @ TheMadTechnician.:) – briantist

+2

Questa è la migliore spiegazione dei set di parametri di PowerShell che ho visto sul web. Questa risposta è molto meglio delle pagine MSDN standard. –

7

Aggiungendo altri due set di parametri puoi fare ciò che desideri. Questo è necessario perché hai ora 3 set, più un parametro non impostato (che tecnicamente lo inserisce nel set __AllParameterSets se ricordo bene). Quindi questo è 4 modi per farlo. Hai bisogno di 6 modi per farlo se sto leggendo la tua domanda correttamente. Si desidera tutte le seguenti opzioni:

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

Quindi dovremo aggiungere i RemoveFromAllGroupsWTran e RetainGroupsWTran set di parametri, entrambi di aggiungere $TransferHomeDrive, $OldServer, e $NewServer (rimuovendo gli altri nomi insieme correlato da loro), poi aggiungere ciascuno al rispettivo parametro di commutazione. Si finisce per assomigliare a questo:

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 
    ) 
} 
Problemi correlati