PowerShell数组使用-ne做多值比较并删除不符合元素的实现问题
问题原因
你写的代码存在几处明显错误:
- 调用
Get-ChildItem时加了-Name参数,返回的$Array元素都是纯字符串,没有Name属性,不需要额外调用.Name - 不能在
foreach遍历ArrayList的过程中直接删除元素,遍历过程中数组长度变化会导致遍历逻辑异常、漏处理元素 - 多值匹配的判断语法错误,PowerShell中判断值不在指定集合内需要用
-notin操作符,不能直接用-ne后接多个值 - 你写的允许值列表语法有误,缺少逗号、存在多余的末尾逗号
推荐解决方法(更简洁)
直接过滤出你需要保留的三个值,覆盖原有数组即可,不需要遍历删除:
$Array = $Array | Where-Object { $_ -in "Classes", "IM Providers", "Intel" }
如果要保留ArrayList类型,可以改成:
[System.Collections.ArrayList]$Array = $Array | Where-Object { $_ -in "Classes", "IM Providers", "Intel" }
遍历删除的正确实现
如果确实需要通过遍历删除的方式实现,要倒序遍历数组索引,从最后一位往第一位删,避免删除元素后索引错乱:
for ($i = $Array.Count - 1; $i -ge 0; $i--) { if ($Array[$i] -notin "Classes", "IM Providers", "Intel") { $Array.RemoveAt($i) } }
内容的提问来源于stack exchange,提问作者user6534872
相关产品推荐
相关产品推荐

