Relacionado: # 5122
Write-Output -NoEnumerate
, quando dada uma coleção, sempre retorna um PSObject[]
vez de um array object[]]
regular, o que é inesperado.
Além disso, isso significa que se um tipo de coleção diferente, como [System.Collections.ArrayList]
for passado, ele _não_ será preservado.
Write-Output
's documentação , que atualmente afirma apenas, "impede que Write-Output enumerar a saída", que soa como a coleção de entrada - seja qual for seu tipo - é simplesmente _passado_ - uma expectativa sensata de que versões do _Windows PowerShell_ até v5.1 realmente honra.Suspeito que essa regressão seja uma consequência do malfadado # 2038 PR que surgiu da edição # 2035.
(Write-Output -NoEnumerate 1, 2).GetType().Name
(Write-Output -NoEnumerate ([System.Collections.ArrayList] (1, 2))).GetType().Name
Object[]
ArrayList
É assim que ainda funciona no _Windows PowerShell_ v5.1
PSObject[]
PSObject[]
Conforme declarado, isso afeta apenas PS _Core_.
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)
Se for uma regressão - é um bug.
Como isso foi permitido continuar por tanto tempo?
@Jaykul Corrigindo isso agora. Depois de uma incursão mais longa do que o necessário nos arquivos de pipeline, descobriu-se que digitar seus parâmetros como PSObject[]
força o PS a enumerar qualquer coleção que você jogue nele durante o estágio de vinculação de parâmetro. No entanto, digitar o parâmetro como PSObject
funciona tanto para singletons quanto para coleções.
Comentários muito úteis
Como isso foi permitido continuar por tanto tempo?