IndexOutOfRange

时间:2016-03-08 12:11:43

标签: powershell indexoutofrangeexception

我收到此错误:

Array assignment failed because index '3' was out of range.
At Z:\CSP\deploys\aplicacional\teste.ps1:71 char:12
+                 $UNAME[ <<<< $i]= $line
+ CategoryInfo          : InvalidOperation: (3:Int32) [], RuntimeException
+ FullyQualifiedErrorId : IndexOutOfRange

我真的无法找到索引结束的原因。

$CSNAME = @(KPScript -c:GetEntryString $PASSHOME\$PASSFILE -pw:$PASS -Field:csname $SEARCH)

$UNAME = @()
$i = 0
Write-Host "Length="$CSNAME.Length
while($i -le $CSNAME.Length)
{
  Write-Host "Start "$i
  #$CSNAME[$i].GetType()
  if ($CSNAME[0].StartsWith("OK:")) {
    Write-Host "ACES $ACES does not exist" -Foreground "red"
  }
  if ($CSNAME[$i].StartsWith("OK:")) {
    break
  }

  Write-Host "CSNAME="$CSNAME[$i]

  $UNAME = $UNAME + $i

  $UNAME = KPScript -c:GetEntryString $PASSHOME\$PASSFILE -pw:$PASS -Field:UserName -ref-csname:$CSNAME[$i]
  foreach ($line in $UNAME) {
    if (! ($line.StartsWith("OK:"))) {
      Write-Host $i
      $UNAME = $UNAME + $i
      Write-Host "uname var"$i
      $UNAME[$i] = $line
    } else {
      Write-Host "break"
      break
    }
  }
  #$UNAME[$i].GetType()
  #if ($UNAME[$i].StartWith("OK:*")){
  #  break
  #}

  Write-Host "UNAME="$UNAME[$i]
  #$UNAME[$i]
  Write-Host "End "$i
  $i += 1
  Write-Host "switch"
}

由于第二个while是基于第一个数组长度并且它有值,为什么它超出范围?

1 个答案:

答案 0 :(得分:1)

PowerShell数组从零开始,因此长度为3的数组的索引值从0到2.但是,代码将从0迭代到3,因为循环条件检查变量是否小于或等于长度(-le):

while($i -le $CSNAME.Length)
{
  ...
}

您需要检查变量是否小于长度(或小于或等于长度减去1):

while($i -lt $CSNAME.Length)
{
  ...
}

此外,您通常使用for循环来迭代数组,因此您可以在一个位置处理索引变量:

for ($i=0; $i -lt $CSNAME.Length; $i++) {
  ...
}

编辑:您将$UNAME初始化为数组,但在循环内部指定$UNAME = KPScript ...,它将该数组替换为脚本返回的任何数组(另一个数组,一个字符串) ,$null,...)。不要在循环中对不同的东西使用相同的变量。将脚本输出分配给另一个变量。此外,您添加到阵列的方式相当复杂。而不是$UNAME = $UNAME + $i; $UNAME[$i] = $line只需$UNAME += $line

$res = KPScript -c:GetEntryString $PASSHOME\$PASSFILE -pw:$PASS -Field:UserName -ref-csname:$CSNAME[$i]
foreach ($line in $res) {
  if (! ($line.StartsWith("OK:"))) {
    $UNAME += $line
  } else {
    break
  }
}