索引超出范围

IndexOutOfRange

我收到这个错误:

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 基于第一个数组长度并且它有值,为什么它超出范围?

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

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

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

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

此外,您通常会使用 for 循环遍历数组,因此您可以在一个地方处理索引变量:

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

编辑: 您将 $UNAME 初始化为一个数组,但在循环中您分配了 $UNAME = KPScript ...,它用脚本 [=] 替换了数组32=](另一个数组,一个字符串,$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
  }
}