PowerShell中数组赋值时避免空数组索引错误的解决方法
解决PowerShell中"Cannot index into a null array"的问题
嘿,这个报错的根源其实很明确:你的$arr2要么没初始化,要么没有任何符合筛选条件的元素,导致它始终是$null。PowerShell里未声明的变量默认是$null,你原来的代码只有当找到匹配项时才会给$arr2赋值,要是一次匹配都没有,$arr2还是$null,这时候去访问$arr2[0]肯定会报错啦。
几个优雅的解决办法
1. 先给$arr2初始化空数组(保底方案)
如果你想保留循环的写法,第一步就得把$arr2初始化成空数组,而不是让它默认成$null:
$arr2 = @() # 先声明为空数组 for ($i=0; $i -lt $arr1.length; $i++) { if ($arr1[$i].source -eq $SomeValue) { $arr2 += $arr1[$i] # 这里不用再套@(),直接加元素就行 } }
不过要提一句:用+=操作数组在PowerShell里效率不高,因为数组是固定大小的,每次+=都会新建一个数组并复制所有元素,数据量大的时候会拖慢速度。
2. 用PowerShell原生筛选语法(最推荐)
其实PowerShell专门有更简洁高效的写法来做这种数组筛选,用管道加Where-Object就行,完全不用写循环:
$arr2 = $arr1 | Where-Object { $_.source -eq $SomeValue }
不管有没有找到匹配项,$arr2都会是一个数组(没匹配到就是空数组),这时候再访问$arr2[0]就不会报错了(最多返回$null,但不会抛出索引错误)。
3. 安全获取第一个元素的小技巧
要是你担心$arr2可能为空,想要更安全地获取第一个元素,可以用这两种方式:
- 用
Select-Object取第一个元素:
$firstElement = $arr2 | Select-Object -First 1
- 要是用的PowerShell 7及以上版本,还可以用空条件运算符:
$firstElement = $arr2?[0]
这两种方式就算$arr2是$null或者空数组,也不会报错,只会返回$null。
总结一下
- 优先用
Where-Object做筛选,既符合PowerShell的惯用写法,又高效简洁 - 要是非得用循环,一定要先把
$arr2初始化成空数组 - 访问数组元素时,尽量用安全的方式避免索引错误
内容的提问来源于stack exchange,提问作者ChrisAdkin
相关产品推荐
相关产品推荐

