2013-03-19 32 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 
    } 
}