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()]」を使用すると、関数は高度な関数に変わります。高度な関数は、"Param" で指定された引数のみを受け取ることができ、それ以上は取ることができません。キースが推奨するように、関数を以前のように動作させるには、追加する必要があります[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 に答える