【问题标题】:Is scriptblock parameter evaluation different for compiled cmdlets and advanced functions?对于已编译的 cmdlet 和高级功能,脚本块参数评估是否不同?
【发布时间】:2011-03-19 02:15:51
【问题描述】:

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

在查看 PowerShell 团队博客中的 this blog post 时,如果脚本块不是参数的有效输入,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(在两个单独的测试中)添加到 ThisShouldBeEvaluatedForEachItem 参数的 Parameter 属性。这样做会使示例工作,尽管它似乎违背了团队博客文章中脚本块参数的规定目的。

【问题讨论】:

    标签: powershell powershell-2.0


    【解决方案1】:

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

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

    我们只调用 ScriptBlock 参数绑定期间的参数当 有管道输入,有 没有简单的方法来绑定 ScriptBlock 直接。

    【讨论】:

    • 实际上,它似乎也可以与 ValueFromPipelineByPropertyName 一起正常工作,只要注意到具有脚本块的参数来自管道。请参阅我更新的问题。谢谢基思。
    • 抱歉,我在上面的示例中添加了它。我在之前的剪切/粘贴中忘记了它。以上是我的初步尝试。我会澄清上面的意图。
    • 多哈。是的,它有效。这就是我所说的“自我诱导的模拟”。 :-)
    • 谢谢基思。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 2014-05-14
    • 2011-02-23
    相关资源
    最近更新 更多