【问题标题】:Pipeline parameter interferes with $args array管道参数干扰 $args 数组
【发布时间】:2014-06-18 04:46:22
【问题描述】:

我正在尝试使用带有管道参数的$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"
...

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

【问题讨论】:

    标签: powershell powershell-2.0


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      当您使用“[cmdletbinding()]”或“[Parameter()]”时,您的函数会变成高级函数。高级函数只能接受“参数”下指定的参数,不能再接受。要使您的函数像以前一样,就像 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
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-10
        • 2018-02-26
        • 1970-01-01
        相关资源
        最近更新 更多