Атрибут PowerShell OutputType не работает

OutputType Атрибут должен давать информацию о типе через intellisense. Однако это не работает, как ожидалось.

Я проверил это в PSReadline и PowerShell ISE, и они работают одинаково.

Ниже приведен пример функции, которую я использую:

Function Get-FirstChar
{
    [OutputType([String])]
    [CmdletBinding()]

    param(
      [Parameter(Mandatory=$true, ValueFromPipeline=$true)][string[]]$Strings
    )

    process {
        foreach ($str in $Strings) {
            $str.SubString(0, 1);
        }   
    }
}

Когда я делаю:


"John","Simon" | Get-FirstChar | % { $_.<TAB> }

Я получаю предложения (независимо от платформы):

Equals       GetHashCode  GetType      ToString

Однако, когда я делаю:

("John","Simon" | Get-FirstChar).<TAB>

Тогда я получаю все строковые методы, такие как SubString и т.п.

Я также попробовал массив строк String[] как тип вывода, и он все еще не работает:(

Может ли кто-то пролить, как о том, как использовать OutputType атрибут, чтобы сказать, что одна или несколько строк будут возвращены из функции powershell?

Спасибо

1 ответ

Решение

Очевидно, ваши ожидания верны. Я должен сказать, что я удивлен, что это не работает для [string] как это работает для других, сложных типов:

function Get-ProcessEx {
    [OutputType([System.Diagnostics.Process])]
    param ()
}

Get-ProcessEx | ForEach-Object { $_.}

Когда я попробовал с [string] Я получаю только свойство (и это не очень полезно для строк, единственное свойство, которое они имеют Length). Я бы посчитал, что ошибка или ограничение способа, которым инструменты вроде PowerShell ISE и PSReadline реагируют на информацию о том, что объекты, возвращаемые из ваших функций, являются строками. Например, если вы попробуете то же самое с другими простыми типами, результат будет соответствовать ожиданиям:

function Get-Int {
    [OutputType([int])]
    param ()
}

Get-Int | ForEach-Object { $_. }

Кажется, это также влияет на командлеты, я не могу получить ни один из существующих командлетов, которые определяют то же самое OutputType обеспечить завершение табуляции для строковых методов:

Get-Command | Where-Object { $_.OutputType.Type -eq [String] }
# Join-Path, not too surprisingly, returns System.String...
Join-Path -Path C:\temp -ChildPath a.txt | ForEach-Object { $_.}

Я предполагаю, что в любом случае стоит сообщить о UserVoice PowerShell.

Другие вопросы по тегам