繁体   English   中英

对于已编译的cmdlet和高级功能,脚本块参数评估是否有所不同?

[英]Is scriptblock parameter evaluation different for compiled cmdlets and advanced functions?

在尝试脚本块时,我试图将脚本块参数与高级功能一起使用,并注意到它的性能与提供给已编译cmdlet的性能不同。

在查阅PowerShell团队博客中的此博客文章时 ,如果脚本块不是该参数的有效输入,则PowerShell引擎应该评估脚本块。 似乎在使用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的响应 ,我在ThisShouldBeEvaluatedForEachItem参数的Parameter属性中添加了ValueFromPipeline和ValueFromPipelineByPropertyName(在两个单独的测试中)。 这样做可以使该示例正常工作,尽管它似乎违反了Team Blog帖子中规定的scriptblock参数的目的。

如果参数是ValueFromPipelineValueFromPipelineByPropertyName则PowerShell将评估脚本块并尝试将结果强制为参数类型。 我们不久前从PowerShell团队那里获得了以下信息:

当参数类型为Object,ScriptBlock或从ScriptBlock派生的类型或这些类型的集合时,将按原样传递ScriptBlock自变量(作为ScriptBlock)。

当有管道输入并且没有直接绑定ScriptBlock的简单方法时,我们仅在参数绑定期间调用ScriptBlock参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM