我收到此错误:
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 :(得分: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
}
}