2016-03-08 64 views
0

我得到这个错误: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是基于第一个数组长度,它有值,为什么它超出范围?

+0

你能帮我理解KPScript的含义吗?这是一种外部命令吗?在PowerShell命令提示符下触发该命令时会得到什么样的输出? – SavindraSingh

+0

您的代码有点令人困惑,但问题在于您使用的是从$ CSNAME.length派生的主索引'$ i'来索引一个完全不同的数组'$ UNAME',所以它们显然不会有相同的长度。我建议你解释这里发生的事情,并包括一些示例文本和预期输出。我相信我们可以为你解决这个问题。 – Matt

+0

@SavindraSingh kpscript是用于访问keepass数据库的cmd工具。 – Matt

回答

1

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 ...,这与任何脚本返回代替阵列(另一个数组,字符串,$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 
    } 
} 
+0

感谢您提供'for循环'建议。它真的简化了代码。关于这个问题,数组的长度是5,所以,它不应该是一个问题。 –

+0

我删除了作为数组初始化的$ UNAME并相应地更改了代码。现在,写主机$ UNAME以一行形式返回所有内容:UNAME = spms OK:操作成功完成。预计什么是一条线(我想要的),当它到达'OK:'线时,它打破了 –

+0

我在哪里告诉你删除数组初始化? –

相关问题