从函数/脚本返回 ArrayList



给定以下脚本:

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

注意:

  • 虽然将集合作为一个整体输出更有效,通常最好避免这样做,因为它可能会使期望 PowerShell 的常规流式处理枚举行为(逐个对象输出(的调用方感到困惑。

最新更新