索引超出范围
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
}
}
我收到这个错误:
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
}
}