对于已编译的cmdlet和高级函数,scriptblock参数评估是否不同?

Ste*_*ski 2 powershell powershell-2.0

在试验scriptblocks时,我试图使用带有高级函数的scriptblock参数,并注意到它的执行方式与提供给编译的cmdlet时的执行方式不同.

在审查这个博客帖子从PowerShell团队博客,看来,如果一个脚本块是不是该参数的有效输入PowerShell引擎应评估脚本块.似乎在使用scriptblock参数调用函数时,它会尝试直接将scriptblock转换为参数类型,而不是根据管道中的当前对象来评估scriptblock.

我的意图是复制行为,如:

Import-CSV somecsv.csv | get-wmiobject -class {$_.class} -Computer {$_.computer}
Run Code Online (Sandbox Code Playgroud)

用于高级功能.

示例脚本:

$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
Run Code Online (Sandbox Code Playgroud)

这是预期的行为,还是我朝错误的方向前进?

基于Keith的响应,我将ValueFromPipeline和ValueFromPipelineByPropertyName(在两个单独的测试中)添加到ThisShouldBeEvaluatedForEachItem参数的Parameter属性中.这样做会使示例工作,尽管它似乎从团队博客帖子中击败了scriptblock参数的既定目的.

Kei*_*ill 5

如果参数是ValueFromPipeline或者ValueFromPipelineByPropertyNamePowerShell将评估Scriptblock并尝试将结果强制转换为参数类型.我们暂时从PowerShell团队获得了这些信息:

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

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