Related: #5122
Write-Output -NoEnumerate
, when given a collection, always returns a PSObject[]
rather than a regular object[]]
array, which is unexpected.
Additionally, this means that if a different collection type such as [System.Collections.ArrayList]
was passed, it is _not_ preserved.
Write-Output
's documentation, which currently only states, "prevents Write-Output from enumerating output", which sounds like the input collection - whatever its type - is simply _passed through_ - a sensible expectation that _Windows PowerShell_ versions up to v5.1 indeed honor.I suspect this regression is a consequence of the ill-fated #2038 PR that arose out of issue #2035.
(Write-Output -NoEnumerate 1, 2).GetType().Name
(Write-Output -NoEnumerate ([System.Collections.ArrayList] (1, 2))).GetType().Name
Object[]
ArrayList
This is how it still works in _Windows PowerShell_ v5.1
PSObject[]
PSObject[]
As stated, this affects PS _Core_ only.
PowerShell Core v6.0.0 on macOS 10.13.2
PowerShell Core v6.0.0 on Ubuntu 16.04.3 LTS
PowerShell Core v6.0.0 on Microsoft Windows 10 Pro (64-bit; v10.0.15063)
If it is a regression - it is a bug.
How has this been allowed to continue for this long?
@Jaykul Fixing this now. After a longer-than-necessary foray into the pipeline files, it turns out that typing your parameters as PSObject[]
forces PS to enumerate whatever collection you throw at it during the parameter binding stage. Typing the param as PSObject
works for both singletons and collections just fine, though.
Most helpful comment
How has this been allowed to continue for this long?