You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 09:27:44