1

我正在尝试使用$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"
...

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

4

2 回答 2

1

创建另一个参数,将其命名为 $rest 并用[Parameter(ValueFromRemainingArguments = $true)].

于 2013-03-19T20:35:13.843 回答
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
    }
}
于 2014-06-17T20:46:22.233 回答