PowerShell数组索引越界错误求助:脚本执行报错排查修复
PowerShell索引越界错误修复方案
错误信息
Vorgesetzer: 1 Index was outside the bounds of the array. At line:87 char:20 + for ($z=0; $z -le $lst_ma_vrg_grp[$i].count-1;$z++){ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : OperationStopped: (:) [], IndexOutOfRangeException + FullyQualifiedErrorId : System.IndexOutOfRangeException
问题根源
- 数组结构定义错误:
$lst_ma_vrg_grp的括号配对混乱,导致部分团队的子数组未正确闭合,数组层级错乱,索引访问时触发越界。 - 循环变量重名冲突:外层遍历团队的循环使用
$i,内层查找主管AD路径的循环也使用$i,覆盖了外层变量值,导致后续循环的索引计算完全错误。 - 循环条件冗余易出错:使用
$z -le $lst_ma_vrg_grp[$i].count-1的写法,当数组长度计算失误时极易触发越界,更安全的写法是直接用$z -lt $lst_ma_vrg_grp[$i].Count(数组索引从0开始,-lt直接匹配最大有效索引)。 - 字符串引号错误:
$lst_title中存在多余引号(""Jobtitle1""),会导致字符串解析异常,间接影响后续数组访问逻辑。
修复后的完整代码
# 修正数组结构:每个团队作为独立子数组,括号正确配对 $lst_ma_vrg_grp = @( @("1", @("Department","Supervisor","Supervisor2","Supervisor3"), @("Department2","Supervisor","Supervisor2","Supervisor3","Supervisor4"), @("Department3","Supervisor","Supervisor2","Supervisor3","Supervisor4")), @("2", @("Department","Supervisor","Supervisor2","Supervisor3"), @("Department2","Supervisor","Supervisor2","Supervisor3","Supervisor4"), @("Department3","Supervisor","Supervisor2","Supervisor3","Supervisor4"), @("Department4","Supervisor","Supervisor2","Supervisor3","Supervisor4")), @("3", @("Department4","Supervisor","Supervisor2","Supervisor3","Supervisor4"), @("Department3","Supervisor","Supervisor2","Supervisor3","Supervisor4")), @("4", @("Department","Supervisor")) ) # 主管AD路径列表 $lst_ma_path = @( @("Supervirsor name 1","CN=,OU=,OU=,OU=,DC=,DC=,DC="), @("Supervirsor name 2","CN=,OU=,OU=,OU=,DC=,DC=,DC="), @("Supervirsor name 3","CN=,OU=,OU=,OU=,DC=,DC=,DC=") ) # 修正引号错误的部门职位列表 $lst_title = @( @("Department","Jobtitle1","AJobtitle2","Jobtitle3"), @("Department2","Jobtitle1","AJobtitle2","Jobtitle3","Jobtitle4","AJobtitle5","Jobtitle6"), @("Department3","Jobtitle1","AJobtitle2","Jobtitle3","Jobtitle4","AJobtitle5","Jobtitle6") ) # 后续省略内容可自行补充 cls $auswahlTeam = Read-Host -Prompt "Welches Team? (1,2,3,4)" $externer = Read-Host -Prompt "Freelancer? (yes / no): " $vorname = Read-Host -Prompt "Firstname" $nachname = Read-Host -Prompt "Lastname" # 遍历部门列表 for ($i=0; $i -lt $lst_title.Length; $i++) { Write-Host $i":" $lst_title[$i][0] } Write-Output "","----------------------------------" $numabt = Read-Host -Prompt "Department" $global:abteilung = $lst_title[$numabt][0] # 遍历团队找对应部门的主管 for ($i=0; $i -lt $lst_ma_vrg_grp.Length; $i++) { if ($auswahlTeam -eq $lst_ma_vrg_grp[$i][0]) { # 修正循环条件,避免越界 for ($z=0; $z -lt $lst_ma_vrg_grp[$i].Count; $z++) { # 跳过团队编号元素(索引0),避免无效匹配 if ($z -eq 0) { continue } if ($abteilung -eq $lst_ma_vrg_grp[$i][$z][0]) { # 列出可选主管 for ($c=1; $c -lt $lst_ma_vrg_grp[$i][$z].Count; $c++) { Write-Host $c":" $lst_ma_vrg_grp[$i][$z][$c] } Write-Output "","----------------------------------" $vorgesetzer = Read-Host -Prompt "Vorgesetzer" $vorgesetzer = $lst_ma_vrg_grp[$i][$z][$vorgesetzer] # 更换循环变量为$j,避免覆盖外层$i for ($j=0; $j -lt $lst_ma_path.Length; $j++) { if ($vorgesetzer -eq $lst_ma_path[$j][0]) { $global:vorgesetzer = $lst_ma_path[$j][1] } } } } } }
额外优化说明
- 添加
if ($z -eq 0) { continue }跳过每个团队子数组的第一个元素(团队编号),避免无效的索引访问。 - 统一使用
-lt $array.Count作为循环条件,符合PowerShell数组索引的常规用法,从根源减少越界风险。 - 数组定义时换行格式化,提升代码可读性,便于后续维护和修改。
内容的提问来源于stack exchange,提问作者ITGUYGER
相关产品推荐
相关产品推荐

