2013-03-19 29 views
1

我正在嘗試使用帶管道參數的$args數組。

函數需要的參數的任意數量(例如參數0)的第一,流水線參數以下:

function rpt-params { 

    param ( 
     [Parameter(ValueFromPipeline=$true,Position=0,Mandatory=$true)][CrystalDecisions.CrystalReports.Engine.ReportDocument]$reportDocument 
    ) 

    try { 
     write-host "count: " $args.count 

     #TODO process args 

    } 
    catch [Exception] { 
     write-host $_.Exception 
    } 
    finally { 
     return $reportDocument 
    } 

} 

嘗試調用的函數產生,讀取「RPT-PARAMS一個錯誤:甲參數不能被發現匹配參數名'param0'。「:

... 
# syntax 0 
rpt-params $rpt -param0 "mb-1" -param1 "me-1" 
... 

... 
# syntax 1; explicitly naming the first parameter 
rpt-params -reportDocument $rpt -param0 "mb-1" -param1 "me-1" 
... 

是我的語法問題還是與使用流水線參數有關?

回答

1

創建另一個參數,稱之爲$ rest,並用[Parameter(ValueFromRemainingArguments = $true)]對其進行裝飾。

0

當您在此處使用「[cmdletbinding()]」或「[Parameter()]」時,您的函數變爲高級函數。高級函數只能採用在「參數」下指定的參數,而不能使用其他參數。爲了讓像以前那樣你的函數的行爲,像基思建議,你需要添加[Parameter(ValueFromRemainingArguments = $true)]

例如:

function rpt-params { 
    param ( 
     [Parameter(ValueFromPipeline=$true,Position=0,Mandatory=$true)] 
     [CrystalDecisions.CrystalReports.Engine.ReportDocument]$reportDocument, 
     [Parameter(ValueFromRemainingArguments=$true)]$args 
    ) 

    try { 
     write-host "count: " $args.count 

     #TODO Now args can have all remaining values 
    } 
    catch [Exception] { 
     write-host $_.Exception 
    } 
    finally { 
     return $reportDocument 
    } 
}