PowerShell遍历数组时空数组赋默认值不生效问题求解
问题根因
你的代码赋值失效是三个PowerShell的默认机制和写法问题共同导致的:
- 管道会自动枚举展开所有数组类型对象:你把
$arr1、$arr2、$arr3传入管道时,空数组$arr1本身没有元素,会被管道直接跳过,根本不会进入后续的判断逻辑;非空的$arr2、$arr3会被拆成单个字符串元素("a"、"b"、"c"、"d")传入循环,你判断的根本不是原数组对象。 - 就算能拿到原数组,在
ForEach-Object里给$_赋值也只是修改管道内的临时变量,不会同步改动外层定义的原数组变量,属于修改副本,原变量不会有变化。 - 你最外层套的
@()只是把管道输出的内容收集成一个全新的数组,既没有在循环里输出修改后的值,也没有把新数组回写到原来的$arr1等变量上,原变量自然不会变动。
可直接运行的修复代码
用[ref]类型存储待处理数组的变量引用,用普通foreach遍历(不走管道避免枚举问题),直接修改原变量的值即可:
$arr1 = @() $arr2 = @("a","b") $arr3 = @("c","d") # 遍历所有待处理数组的引用,不要用管道传参避免数组被展开 foreach ($targetArr in @([ref]$arr1, [ref]$arr2, [ref]$arr3)) { # 判断数组长度,为空就写入指定默认值 if ($targetArr.Value.Count -eq 0) { $targetArr.Value = @("EMPTY") } } # 验证执行结果 Write-Host "=== arr1 输出 ===" $arr1 Write-Host "=== arr2 输出 ===" $arr2 Write-Host "=== arr3 输出 ===" $arr3
执行后控制台输出如下,空数组已经被正确写入默认值:
=== arr1 输出 === EMPTY === arr2 输出 === a b === arr3 输出 === c d
内容的提问来源于stack exchange,提问作者Erelephant
相关产品推荐
相关产品推荐

