2010-10-15 18 views
22

È possibile sovraccaricare le funzioni in PowerShell?Sovraccarico funzione in PowerShell

Voglio che la mia funzione accetti una stringa, un array o un interruttore.

Un esempio di quello che voglio:

  • Backup-UsersData monoutente
  • Backup-UsersData @ ('Alice', 'Bob', 'Joe')
  • Backup-UsersData -tutti
+1

"set di parametri" sono sostanzialmente equivalente al metodo OO sovraccarico. A volte sono un po 'più complicati a causa del parser pesante di coercizione di tipo di Poewrshell. – x0n

risposta

25

Nelle funzioni di PowerShell non sono sovraccarichi. L'ultima definizione sovrascrive il precedente nello stesso ambito o nasconde il precedente in un ambito genitore. Pertanto, dovresti creare una singola funzione e fornire un modo per distinguere la sua modalità di chiamata dagli argomenti.

In V2 è possibile utilizzare una funzione avanzata, vedere help about_Functions_Advanced_Parameters ed evitare alcuni codifica manuale sulla risoluzione dei parametri impostati ambiguità:

# advanced function with 3 parameter sets 
function Backup-UsersData 
(
    [Parameter(Position=0, ParameterSetName="user")] 
    [string]$user, 
    [Parameter(Position=0, ParameterSetName="array")] 
    [object[]]$array, 
    [Parameter(Position=0, ParameterSetName="all")] 
    [switch]$all 
) 
{ 
    # use this to get the parameter set name 
    $PSCmdlet.ParameterSetName 
} 

# test 
Backup-UsersData -user 'John' 
Backup-UsersData 1, 2 
Backup-UsersData -all 

# OUTPUT: 
# user 
# array 
# all 

Si noti che questo meccanismo è a volte strano. Ad esempio nel primo test dobbiamo specificare il nome del parametro -user in modo esplicito. In caso contrario:

Backup-UsersData : Parameter set cannot be resolved using the specified named parameters. 
At C:\TEMP\_101015_110059\try2.ps1:21 char:17 
+ Backup-UsersData <<<< 'John' 
    + CategoryInfo   : InvalidArgument: (:) [Backup-UsersData], ParentContainsErrorRecordException 
    + FullyQualifiedErrorId : AmbiguousParameterSet,Backup-UsersData 

In molti casi standard, non avanzata, funzione con parametri misti farà:

function Backup-UsersData 
(
    [string]$user, 
    [object[]]$array, 
    [switch]$all 
) 
{ 
    if ($user) {'user'} 
    elseif ($array) {'array'} 
    elseif ($all) {'all'} 
    else {'may be'} 
} 

Backup-UsersData -user 'John' 
Backup-UsersData -array 1, 2 
Backup-UsersData -all 
Backup-UsersData 

Ma in questo caso si dovrebbe risolvere (o accettare) e ignorare le ambiguità, per esempio per decidere cosa fare se, dire:

Backup-UsersData -user 'John' -array 1, 2 -all 
5

Qui è una variante della risposta di Romano che secondo me è un po 'più flessibile:

function Backup 
{ 
    [CmdletBinding(DefaultParameterSetName='Users')] 
    Param (
     [parameter(mandatory=$true, ParameterSetName='Users', position=0, ValueFromPipeline=$true)][string[]]$User, 
     [parameter(mandatory=$true, ParameterSetName='AllUsers')][switch]$All 
    ) 

    Begin 
    { 
     if ($All) { $User = @('User1', 'User2', 'User3') } 
    } 

    Process 
    { 
     foreach ($u in $User) 
     { 
      echo "Backup $u" 
     } 
    } 
} 
Problemi correlati