Bellow是一个声明OutputType的示例函数。

我了解这仅是出于文档目的,但是这里的问题是当我调用PSScriptAnalyzer时:

invoke-scriptanalyzer . -IncludeRule PSUseOutputTypeCorrectly

它会告诉我:


function Test-Function
{
    [CmdletBinding()]
    [OutputType([System.Management.Automation.PSCustomObject[]])]
    param ()

    [PSCustomObject[]] $TestObject = @()

    for ($i = 0; $i -lt 5; $i++)
    {
        $TestObject += [PSCustomObject]@{
            Key1 = "Value1"
            Key2 = "Value2"
        }
    }

    return $TestObject
}

问题是我怀疑此引用消息是误报,但无法确认。

我认为我宣布了OutputType属性就好了,或者也许不行?

为什么需要将[OutputType([System.Object[]])]指定为输出类型?如果我要返回PSCustomObject[]

最佳答案

除非另有说明,否则您从函数中获取的return都会由管道枚举,因此,例如,当您将任何内容分配给变量时,您的[psobject[]]将被“解包”并塞回到动态大小的[object[]]中。

如果要按原样返回可枚举的集合,请使用Write-Output -NoEnumerate:

function Test-Function
{
    [CmdletBinding()]
    [OutputType([System.Management.Automation.PSCustomObject[]])]
    param ()

    [PSCustomObject[]] $TestObject = @()

    for ($i = 0; $i -lt 5; $i++)
    {
        $TestObject += [PSCustomObject]@{
            Key1 = "Value1"
            Key2 = "Value2"
        }
    }

    Write-Output $TestObject -NoEnumerate
}

08-18 05:18