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
相关产品推荐
相关产品推荐

