如何使用 $_ 自动变量调用 PowerShell 脚本块

4

工作原理 -

假设我有一个 scriptblock 我会和 Select-Object cmdlet 一起使用。

$jobTypeSelector = `
    {
        if ($_.Type -eq "Foo")
        {
            "Bar"
        }
        elseif ($_.Data -match "-Action ([a-zA-Z]+)")
        {
            $_.Type + " [" + $Matches[1] + "]"
        }
        else
        {
            $_.Type
        }
    }

$projectedData = $AllJobs | Select-Object -Property State, @{Name="Type"; Expression=$jobTypeSelector}

这个很好用,我按预期得到了结果。

我想做的事情 -

然而,在代码的后面,我想要重新使用定义为$jobTypeSelectorscriptblock

例如,我期望下面的代码将会把传递作为参数的单一对象$fooJob用于scriptblock中的$_自动变量,并返回和在Select-Object cmdlet上下文执行时相同的结果。

$fooType = $jobTypeSelector.Invoke($fooJob)

问题:

我的代码不如我所预期的那样工作,返回了空值。

我已尝试过的方法:

  1. 我检查了所有属性是否都正确设置,并且它不是因为空白或 $null 的相关属性本身导致的问题。

  2. 我在互联网上搜索,似乎很难找到任何相关页面,但最终我找到了一个与此问题略微不同但相似的页面 - 在 PowerShell 中调用脚本块。这篇博客没有直接回答我的问题,而任何相关的解释只会导致一种非常丑陋、难以阅读和维护的解决方案,依我看来。

问题:

那么,什么是调用 scriptblock 的最佳方式,用 $_ 自动变量作为参数(而不是 param 块),针对单个对象?

2个回答

5

在尝试了各种选项后,我最终通过某种“hackish”的方法解决了问题。但我认为这是最好的解决方案,因为它小巧、易于阅读、维护和理解。

虽然我们正在讨论单个对象,但请将其与ForEach-Object cmdlet一起在管道中使用(这是PowerShell定义$_自动变量的时候),以便更好地进行操作。

$fooType = $fooJob | ForEach-Object $jobTypeSelector

2

您可以像您提到的那样使用foreachForEach-Object

您还可以直接将管道传输到ScriptBlock,如果您将其从函数ScriptBlock更改为过滤器 ScriptBlock,并将IsFilter设置为$true:

$jobTypeSelector.IsFilter = $true

$fooType = $fooJob | $jobTypeSelector

但是,更好的做法是使用命名函数而不是匿名ScriptBlock,例如:

function Get-JobType
{
    Param ( 
        [object] $Job 
    )

    if ($Job.Type -eq "Foo")
    {
        "Bar"
    }
    elseif ($Job.Data -match "-Action ([a-zA-Z]+)")
    {
        $Job.Type + " [" + $Matches[1] + "]"
    }
    else
    {
        $Job.Type
    }
}

然后你可以像这样使用Select-Object,也称为select
$projectedData = $AllJobs |
    select -Property State, @{Name="Type"; Expression={Get-JobType $_}}

或者只使用一个作业,像这样:

$fooType = Get-JobType $fooJob

5
谢谢您的回复。我知道这可能是一个函数,但是关于您提到的另一个选项…将“IsFilter”设置为“$true”时,我收到以下错误-“Exception setting” IsFilter“:”由于对象的当前状态,操作无效。“有什么想法吗?如何设置它?文件和示例对此属性似乎非常贫乏,我找不到任何初始化为此状态的脚本块的方法。 - Vikas Gupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接