2010-10-15 42 views
22

您可以重載PowerShell中的函數嗎?PowerShell中的函數重載

我想我的函數接受一個字符串,數組或某些開關。

的我想要的一個例子:

  • 備份 - UsersData單用戶
  • 備份 - UsersData @( '愛麗絲', '鮑勃', '喬')
  • 備份 - UsersData -all
+1

「參數設置」,基本上等同於面向對象方法重載。由於poewrshell的強類型重語法分析器,他們有時候有點棘手。 – x0n 2010-10-17 10:12:38

回答

25

在PowerShell函數中不會超載。最後一個定義覆蓋同一範圍內的前一個定義或隱藏父範圍中的前一個定義。因此,您應該創建一個函數並提供一種方法來通過參數區分其調用模式。

在V2,你可以使用高級功能,請參閱help about_Functions_Advanced_Parameters,避免對解決參數集含糊一些手工編碼:

# 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 

注意這個機制有時是奇怪。例如,在第一個測試中,我們必須明確指定參數名稱-user。否則:

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 

在許多情況下標準,而不是先進的,具有混合參數函數就可以了:

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 

但在這種情況下,你應該可以解決(或接受並忽略)歧義,例如決定做什麼,如果,說:

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

這裏是羅馬的回答的一個變種,我認爲是更靈活一點:

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