Предупреждение атрибута OutputType в PowerShell с помощью PSScriptAnalyzer - PullRequest
2 голосов
/ 29 февраля 2020

Ниже приведен пример функции, которая объявляет OutputType.

Я понимаю, что это только для целей документирования, но проблема здесь в том, что когда я вызываю PSScriptAnalyzer:

invoke-scriptanalyzer . -IncludeRule PSUseOutputTypeCorrectly

он скажет мне это:

Командлет '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
}

Вопрос в том, что я подозреваю, что это информационное сообщение является ложноположительным, но не может подтвердить.

Мне кажется, я объявил атрибут OutputType просто отлично, а может и нет?

Зачем мне нужно указывать [OutputType([System.Object[]])] в качестве типа вывода? если я вернусь PSCustomObject[]?

1 Ответ

2 голосов
/ 29 февраля 2020

Если не указано иное, все, что вы 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
}
...