在试验scriptblocks时,我试图使用带有高级函数的scriptblock参数,并注意到它的执行方式与提供给编译的cmdlet时的执行方式不同。
在PowerShell团队博客中查看this blog post时,如果脚本块不是参数的有效输入,则PowerShell引擎应该正在评估scriptblock。似乎在使用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(在两个单独的测试中)添加到ThisShouldBeEvaluatedForEachItem参数的Parameter属性中。这样做会使示例工作,尽管它似乎从团队博客帖子中击败了scriptblock参数的既定目的。
答案 0 :(得分:5)
如果参数为ValueFromPipeline
或ValueFromPipelineByPropertyName
,则PowerShell将评估Scriptblock并尝试将结果强制转换为参数类型。我们暂时从PowerShell团队获得了这些信息:
ScriptBlock参数按原样传递 (作为ScriptBlock)参数时 type是Object,ScriptBlock或类型 源自ScriptBlock,或 这些类型的集合。
我们只调用ScriptBlock 参数绑定时的参数 有管道输入,有 没有简单的方法来绑定ScriptBlock 直接