从函数/脚本返回 ArrayList

Ada*_*dam 4 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().Name
$things = f -verbose
$things.GetType().Name
Run Code Online (Sandbox Code Playgroud)

为什么最后一行中的$thingsbe-of-type不会ArrayList

mkl*_*nt0 7

输出集合(不仅仅是数组)会导致 PowerShell 在默认情况下枚举它们- 即,集合的元素被一一发送到成功输出流。

  • 如果您通过在变量中捕获输出来收集这些元素,您总是会得到一个常规的 PowerShell 数组 ( [object[]]),除非只有一个元素,它按原样捕获。

为了防止这种情况 - 即,作为一个整体输出集合- 使用:

Write-Output -NoEnumerate $t
Run Code Online (Sandbox Code Playgroud)

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

, $t    # implicit output, no Write-Output needed
Run Code Online (Sandbox Code Playgroud)