PowerShell二维数组foreach循环单元素场景异常问题咨询
PowerShell二维数组单元素时foreach遍历异常的原因与解决方法
问题原因
PowerShell的数组字面量@()存在**自动展开(unroll)**特性:当你传入单个集合(比如单个子数组)作为@()的内容时,它会将这个子数组的元素直接提取出来,作为顶层数组的元素,最终得到的是一维数组,而非包含子数组的二维数组。
比如示例中的单元素二维数组定义:
$packScoop = @( @("Scoop", "scoop", "get.scoop.sh") )
实际生成的是一维数组"Scoop", "scoop", "get.scoop.sh",而非@(@("Scoop", ...))的二维结构。此时foreach遍历的是一维数组中的每个字符串,而PowerShell中字符串可被当作字符数组访问,因此$curr[0]会取到字符串的第一个字符,$curr[1]取第二个,最终出现遍历单个字符的异常输出。
而当@()中传入多个子数组时,PowerShell不会触发自动展开,会保留二维数组结构,foreach遍历的是每个子数组,因此能正常获取子数组元素。
解决方案
方法1:用逗号运算符强制包装
在子数组前添加逗号, ,将子数组标记为单个元素,阻止@()的自动展开:
$packScoop = @( ,@("Scoop", "scoop", "get.scoop.sh") )
方法2:显式声明数组类型
通过类型约束强制变量为二维数组类型,避免自动展开:
# 声明变量为二维数组类型 [array[]]$packScoop = @( @("Scoop", "scoop", "get.scoop.sh") ) # 或直接转换为二维数组 $packScoop = [array[]]@( @("Scoop", "scoop", "get.scoop.sh") )
测试代码修复
将测试代码修改为以下形式,即可得到预期输出:
foreach ($curr in ,@("HI", "Bi", "Try")) { Write-Host "$($curr[0]) - $($curr[1]) - $($curr[2])" }
内容的提问来源于stack exchange,提问作者Andre Mossi
相关产品推荐
相关产品推荐

