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[]
?
除非另有说明,否则您从函数中获取的任何内容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
}