PowerShell中向ArrayList插入对象时触发索引越界错误的技术求助
解决PowerShell ArrayList插入时的索引越界问题
咱们先把问题的核心揪出来:你当前的代码里,$DriveObject.Add("$drives")这一步是把整个$drives数组转成了单个字符串(因为加了双引号),所以$DriveObject里其实只有一个元素:"value1 value2"。这时候你用$DriveObject.LastIndexOf('value2')去查找,列表里根本没有单独的'value2'元素,这个方法会返回-1——而Insert方法要求索引必须是非负数,且不能超过列表长度,用-1自然就触发了那个索引越界错误。
换成简单字符串测试能成功,应该是你测试时用的是列表里实际存在的元素,能拿到有效的非负索引,所以插入操作正常执行。
修正后的代码示例
先把ArrayList的元素添加逻辑改对,确保每个drive和user都是列表里的独立元素:
# 一些模拟值 $drives = "value1","value2" [System.Collections.ArrayList]$DriveObject = @() # 逐个添加drives的元素,而非转成单个字符串 foreach ($drive in $drives) { $DriveObject.Add($drive) | Out-Null } # 一些模拟用户 $FilterUser = "User1","User2" [System.Collections.ArrayList]$UserObject = @() # 同样逐个添加用户元素 foreach ($user in $FilterUser) { $UserObject.Add($user) | Out-Null } # 先获取"value2"的索引,确认存在再执行插入 $targetIndex = $DriveObject.LastIndexOf('value2') if ($targetIndex -ne -1) { # 如果你想把UserObject的所有元素插入到目标位置: foreach ($user in $UserObject) { $DriveObject.Insert($targetIndex, $user) $targetIndex++ # 插入后后续元素后移,索引+1才能保持顺序 } # 如果你是要把整个UserObject作为单个元素插入,用下面这行: # $DriveObject.Insert($targetIndex, $UserObject) } else { Write-Warning "未找到目标元素'value2'" } # 输出结果 $DriveObject
针对XML场景的额外建议
因为你提到是在处理从文件加载的XML对象,其实如果是要往XML节点里插入子元素,更推荐直接用XML对象的原生方法(比如CreateElement、AppendChild、InsertBefore),而不是用ArrayList中转。举个简单例子:
# 假设已加载XML文档到$xmlDoc,目标节点是$targetDriveNode foreach ($user in $FilterUser) { $userNode = $xmlDoc.CreateElement("User") $userNode.InnerText = $user # 把用户节点插入到目标drive节点之后 $targetDriveNode.ParentNode.InsertAfter($userNode, $targetDriveNode) }
这种方式更贴合XML操作的逻辑,也能避免ArrayList带来的索引类问题。
内容的提问来源于stack exchange,提问作者TenBob
相关产品推荐
相关产品推荐

