PowerShell中带有PSScriptAnalyzer的OutputType属性警告

问题描述 投票:1回答:1

Bellow是声明OutputType的示例函数。

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

invoke-scriptanalyzer . -IncludeRule PSUseOutputTypeCorrectly

它将告诉我:

cmdlet'测试功能'返回类型为'System.Object []'的对象但是此类型未在OutputType属性中声明。

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[]

powershell attributes analyzer
1个回答
0
投票

除非另有说明,否则您从函数中获取的任何内容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
}
© www.soinside.com 2019 - 2024. All rights reserved.