Powershell 从函数/脚本返回ArrayList

Powershell 从函数/脚本返回ArrayList,powershell,Powershell,给定以下脚本: function f { [CmdletBinding()]Param() Write-Verbose 'f: Start' $t = New-Object 'System.Collections.ArrayList' Write-Verbose $t.GetType().Name return $t } $things = New-Object 'System.Collections.ArrayList' $things.GetType

给定以下脚本:

function f {
    [CmdletBinding()]Param()
    Write-Verbose 'f: Start'
    $t = New-Object 'System.Collections.ArrayList'
    Write-Verbose $t.GetType().Name
    return $t
}

$things = New-Object 'System.Collections.ArrayList'
$things.GetType().Name
$things = f -verbose
$things.GetType().Name

为什么最后一行的
$things
不是
ArrayList
类型?

输出集合(不仅仅是数组)会导致PowerShell在默认情况下枚举它们——也就是说,集合的元素会逐个发送到成功输出流

  • 如果通过捕获变量中的输出来收集这些元素,则始终会获得常规PowerShell数组(
    [object[]]
    ),除非只有一个元素按原样捕获
要防止出现这种情况(即,将集合作为一个整体输出),请使用:

Write-Output -NoEnumerate $t
一种更短、更有效但不太明显的替代方法是将集合包装在一个辅助的单元素数组中,使用一元形式的数组构造运算符
,这会导致PowerShell枚举外部数组并按原样输出集合:

, $t    # implicit output, no Write-Output needed