2010-10-15 20 views
22

PowerShell'de işlevler yüklenir mi?PowerShell'de aşırı işlev yükleme

Bir dizeyi, diziyi veya bazı anahtarları kabul etme işlevimi istiyorum.

ne istiyorum örneği:

  • Yedekleme-UsersData singleUser
  • Yedekleme-UsersData @ ('Alice', 'Bob', 'Joe')
  • Yedekleme-UsersData -tüm
+1

"Parametre ayarlar" OO yöntemi aşırı yüklenmelere temelde eşdeğerdir. Onlar poewrshell'in tip-zorlama ağır ayrıştırıcısı nedeniyle zaman zaman biraz trickier. – x0n

cevap

25

PowerShell işlevlerinde aşırı yüklenme yok. Son tanım, bir öncekini aynı kapsamda geçersiz kılar veya bir ana kapsamda önceki gizler. Böylece, tek bir işlev oluşturmalı ve çağrı modunu argümanlarla ayırt etmenin bir yolunu sağlamalısınız.

V2 size, gelişmiş bir işlevi kullanmak help about_Functions_Advanced_Parameters görmek ve parametre seti belirsizlikleri çözmek bazı manuel kodlama önleyebilir:

# 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 

Not Bu mekanizma bazen tuhaf olduğunu. Örneğin, ilk testte -user parametre ismini açıkça belirtmeliyiz. Aksi halde:

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 

Ancak bu durumda sen belirsizlikler, örneğin çözmek (veya kabul edip görmezden) olmalıdır: gelişmiş değil birçok durumda standart olarak

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 

, karışık parametrelerle işlevi yapacak demek, eğer ne yapacağına karar için:

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

biraz daha esnek olduğunu düşünüyorum Roman cevabın bir çeşididir:

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