Pipeline参数会干扰$ args数组

时间:2013-03-19 20:29:49

标签: powershell powershell-v2.0

我正在尝试使用带有管道参数的$args数组。

该函数需要在第一个流水线参数之后的任意数量的参数(例如param0):

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

我的语法是问题还是与使用流水线参数有关?

2 个答案:

答案 0 :(得分:1)

创建另一个参数,称为$ rest,并用[Parameter(ValueFromRemainingArguments = $true)]装饰它。

答案 1 :(得分:0)

使用" [cmdletbinding()]"或" [Parameter()]",在这种情况下,您的功能变为高级功能。高级函数只能获取" Param"中指定的参数。而且没有了。为了使您的功能像以前一样,就像Keith建议的那样,您需要添加[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
    }
}