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 RetainGroups
RemoveFromAllGroups
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?
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
Ottima domanda, grazie! –