[英]How to provide default value for a parameter in PowerShell help for compiled cmdlets
[英]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参数的目的。
如果参数是ValueFromPipeline
或ValueFromPipelineByPropertyName
则PowerShell将评估脚本块并尝试将结果强制为参数类型。 我们不久前从PowerShell团队那里获得了以下信息:
当参数类型为Object,ScriptBlock或从ScriptBlock派生的类型或这些类型的集合时,将按原样传递ScriptBlock自变量(作为ScriptBlock)。
当有管道输入并且没有直接绑定ScriptBlock的简单方法时,我们仅在参数绑定期间调用ScriptBlock参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.