代码之家  ›  专栏  ›  技术社区  ›  Steven Murawski

对于已编译的Cmdlet和高级函数,脚本块参数评估是否不同?

  •  2
  • Steven Murawski  · 技术社区  · 14 年前

    在使用脚本块进行试验时,我试图将脚本块参数与高级函数一起使用,并注意到它的执行方式与提供给已编译的Cmdlet时不同。

    在审查中 this blog post 从PowerShell团队日志中,如果脚本块不是参数的有效输入,则PowerShell引擎似乎应评估脚本块。似乎在使用scriptBlock参数调用函数时,它试图将scriptBlock直接转换为参数类型,而不是基于管道中的当前对象评估scriptBlock。

    我的目的是复制如下行为:

    Import-CSV somecsv.csv | get-wmiobject -class {$_.class} -Computer {$_.computer}
    

    高级功能。

    示例脚本:

    $sb = {throw "If there was an error, the scriptblock was evaluated!"}
    
    function test ()
    {
      param (
        [Parameter()]
        [string]
        $ThisShouldBeEvaluatedForEachItem,
        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [string]
        $FullName
     )  
    
     process 
     {  
      write-host $Fullname, $ThisShouldBeEvaluatedForEachItem
     }
    } 
    Get-ChildItem | test -ThisShouldBeEvaluatedForEachItem $sb
    

    这是有意的行为还是我走错了方向?

    基于 Keith's response ,我将valuefrompipeline和valuefrompipelinebypropertyname(在两个单独的测试中)添加到thisshouldbeeevaluatedForEachtem参数的参数属性中。这样做可以使示例工作,尽管它似乎违背了团队博客帖子中所述的脚本块参数的目的。

    1 回复  |  直到 14 年前
        1
  •  5
  •   Keith Hill    14 年前

    如果参数为 ValueFromPipeline ValueFromPipelineByPropertyName 然后,PowerShell将评估ScriptBlock并尝试将结果强制为参数类型。我们之前从PowerShell团队获得了以下信息:

    脚本块参数按原样传递 (作为脚本块)当参数 类型是对象、脚本块或类型 从脚本块派生,或 这些类型的集合。

    我们只调用脚本块 参数绑定期间的参数 有管道输入,有 绑定脚本块的方法并不简单 直接。

    推荐文章