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

PowerShell 4.0哈希表数组遍历及值访问异常问题求助

解决PowerShell哈希表数组索引越界问题

错误原因分析

你遇到的IndexOutOfRangeException错误,核心是$var的值超出了数组的有效索引范围——数组索引从0开始,最大有效索引为数组长度-1,当$var大于等于数组长度时,调用GetValue就会触发该错误。常见诱因包括:

  • 预先初始化固定长度数组,但实际填充的进程数超过数组长度,或循环计数逻辑错误。
  • 循环终止条件设置错误(比如用$i -le $myArray.Length而非$i -lt $myArray.Length)。
  • 直接使用GetValue方法时未先校验索引有效性。

修正后的代码示例

方式1:动态收集哈希表(最简便)

无需预先固定数组大小,PowerShell会自动扩容数组:

# 收集Firefox进程信息到哈希表数组
$myArray = @()
Get-Process firefox | ForEach-Object {
    $myArray += @{
        ProcessId = $_.Id
        ProcessName = $_.Name
        ProcessObj = $_
    }
}

# 遍历数组并停止进程
foreach ($procHash in $myArray) {
    if ($procHash.ProcessId) {
        Stop-Process -Id $procHash.ProcessId -Force -ErrorAction SilentlyContinue
        Write-Host "已停止进程ID: $($procHash.ProcessId)"
    }
}

方式2:使用ArrayList高效收集(适合大量进程)

如果需要频繁添加元素,ArrayList比普通数组的+=操作更高效:

$myArray = New-Object System.Collections.ArrayList
Get-Process firefox | ForEach-Object {
    # 用$null接收返回值避免输出添加计数
    $null = $myArray.Add(@{
        ProcessId = $_.Id
        ProcessName = $_.Name
    })
}

# 索引遍历的正确写法(替代GetValue)
for ($i = 0; $i -lt $myArray.Count; $i++) {
    $hTAux = $myArray[$i]
    if ($hTAux) {
        Stop-Process -Id $hTAux.ProcessId -Force
    }
}

关键注意事项

  1. 避免固定长度数组:除非你能提前确定元素数量,否则不要用New-Object 'Hashtable[]' X初始化固定大小数组,极易导致索引越界。
  2. 优先用[]运算符访问元素:相比GetValue方法,$myArray[$i]更直观且符合PowerShell的惯用写法。
  3. 校验元素有效性:遍历前可检查数组是否为空,访问哈希表值前确认元素非null,避免后续操作报错。

内容的提问来源于stack exchange,提问作者lanz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:50:23