Атрибут 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.