You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell返回仅含1个子列表的嵌套列表时结构不符预期

问题根因

PowerShell 函数返回存在默认的集合枚举(Unrolling)机制:执行return时不会将后续对象原样返回,而是会自动遍历集合内的元素,逐个写入输出管道。

  • 当外层集合包含2个及以上内层列表时,输出管道会接收到多个独立的内层列表对象,赋值给变量时会自动包装为集合,嵌套结构符合预期。
  • 当外层集合仅包含1个内层列表时,PowerShell会继续枚举这个唯一的内层集合,直接把内层存储的"A"、"B"字符串写入输出管道,最终得到的是单层字符串列表,嵌套结构被破坏。
问题复现

原始问题函数:

Function Get-ListOfList
{
    $listOfLists =  New-Object System.Collections.ArrayList
    $List =  New-Object System.Collections.ArrayList

    $List.Add("A") | Out-Null
    $List.Add("B") | Out-Null

    $listOfLists.Add($List) | Out-Null  
    return $listOfLists
}

测试脚本:

$l =  Get-ListOfList
$l.Count
$l.GetType().Name
$l[0].Count
$l[0].GetType().Name
$l[1].Count
$l[1].GetType().Name

实际错误输出:

2
ArrayList
1
String
1
String

预期结果应为外层列表Count为1,唯一元素是包含2个字符串的内层ArrayList,实际返回了包含2个字符串的单层列表。

修复方案

两种方案均可保证无论外层集合包含多少个内层元素,返回的嵌套结构始终一致:

  • 方案1:使用一元逗号运算符包装返回值
    逗号运算符会生成一个仅包含原嵌套集合的临时单元素数组,PowerShell枚举时只会解开这层临时包装,不会继续展开内层集合,只需修改return语句:
    return ,$listOfLists
    
  • 方案2:使用Write-Output的-NoEnumerate参数禁止枚举
    显式指定输出时不遍历集合元素,原样返回嵌套结构:
    Write-Output $listOfLists -NoEnumerate
    

修复后运行测试脚本,将得到符合预期的输出:

1
ArrayList
2
ArrayList

内容的提问来源于stack exchange,提问作者deetle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 00:36:19