使用 PSScriptAnalyzer 的 PowerShell 中的 OutputType 属性警告

met*_*ter 4 powershell attributes analyzer

波纹管是一个示例函数,它声明OutputType.

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

invoke-scriptanalyzer . -IncludeRule PSUseOutputTypeCorrectly
Run Code Online (Sandbox Code Playgroud)

它会告诉我:

cmdlet“Test-Function”返回“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
}
Run Code Online (Sandbox Code Playgroud)

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

我想我声明这个OutputType属性很好,或者也许不是?

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

Mat*_*sen 5

除非另有说明,否则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
}
Run Code Online (Sandbox Code Playgroud)