PowerShell for 循环不添加先前循环数组中的最后一个值
PowerShell for loop not adding last value from previously looped arrays
我完全被难住了。我正在将 XML 文件中的数据读入两个单独的数组,然后按索引(即 ($array-element[0], $array2-element[0])
)将它们组合在第三个数组中:
这就是我的 XML 有点像:
XML
<RESULTS>
<ROW>
<COLUMN NAME="ATTR1"><![CDATA[123456ABCDEF]]></COLUMN>
<COLUMN NAME="ATTR2"><![CDATA[0.0.0.0]]></COLUMN>
<COLUMN NAME="ATTR3"><![CDATA[Hello World]]></COLUMN>
<COLUMN NAME="ATTR4"><![CDATA[Lorem ipsum]]></COLUMN>
<COLUMN NAME="ATTR5"><![CDATA[This is some text]]></COLUMN>
</ROW>
</RESULTS>
这是我的 PowerShell 脚本,它将 ATTR2
和 ATTR3
读取到两个单独的数组中:
PowerShell(前两个数组)
$array = @()
$array2 = @()
foreach ($name in $xmldata.RESULTS.ROW.COLUMN.Where{ $_.NAME -eq "ATTR3"}.'#cdata-section')
{
$array += $name
}
foreach ($version in $xmldata.RESULTS.ROW.COLUMN.Where{ $_.NAME -eq "ATTR2"}.'#cdata-section')
{
$array2 += $version
}
它 return 是想要的结果。
然后我将每个数组中的匹配索引分组到一个新数组中 ($array3
):
PowerShell(第三个阵列)
$array3 = @()
for($i = 0; $i -lt $array.Length; $i++)
{
$array3 += $array[$i] + ", " + $array2[$i]
$i++
}
它 return 是想要的结果(见下文):
结果
Hello World, 0.0.0.0
(so on and so forth...)
但是,最后一个 for-loop
拒绝将 $array
和 $array2
的最后一个值添加到 $array3
。
$array.Length
告诉我 $array
和 $array2
的长度是 896 即使 只有 895 个元素。当我 return $array[896]
我得到零结果。当我 return $array[895]
它 return 是我要查找的最后一个值。
如果数组的长度确实是896,那么$i
应该停在895,对吧?所以,我假设它会获取最终值(索引为 895)。那么,为什么我的 for-loop
没有添加最终值?
您的 for
循环的直接问题是您已经指定 $i++
应该在循环签名 ($i = 0; $i -lt $array.Length; $i++
) 中的每次迭代后执行,但是随后您也在正文中手动调用 $i++
。
也就是说,真正的解决方案是首先不要将列拆分为 2 个数组。相反,当您第一次迭代它时,为 XML 中的每个 ROW
节点创建一个新对象:
# assign all output from `foreach` loop to `$array`
$array = foreach($row in $xmldata.RESULTS.ROW){
# create new object with the pertinent details as property values
[pscustomobject]@{
Name = $row.COLUMN.Where{ $_.NAME -eq "ATTR3"}.'#cdata-section'
Version = $row.COLUMN.Where{ $_.NAME -eq "ATTR2"}.'#cdata-section'
}
}
现在,$array
每个 ROW
节点将包含一个对象,每个节点都有自己的 Name
和 Version
属性
我完全被难住了。我正在将 XML 文件中的数据读入两个单独的数组,然后按索引(即 ($array-element[0], $array2-element[0])
)将它们组合在第三个数组中:
这就是我的 XML 有点像:
XML
<RESULTS>
<ROW>
<COLUMN NAME="ATTR1"><![CDATA[123456ABCDEF]]></COLUMN>
<COLUMN NAME="ATTR2"><![CDATA[0.0.0.0]]></COLUMN>
<COLUMN NAME="ATTR3"><![CDATA[Hello World]]></COLUMN>
<COLUMN NAME="ATTR4"><![CDATA[Lorem ipsum]]></COLUMN>
<COLUMN NAME="ATTR5"><![CDATA[This is some text]]></COLUMN>
</ROW>
</RESULTS>
这是我的 PowerShell 脚本,它将 ATTR2
和 ATTR3
读取到两个单独的数组中:
PowerShell(前两个数组)
$array = @()
$array2 = @()
foreach ($name in $xmldata.RESULTS.ROW.COLUMN.Where{ $_.NAME -eq "ATTR3"}.'#cdata-section')
{
$array += $name
}
foreach ($version in $xmldata.RESULTS.ROW.COLUMN.Where{ $_.NAME -eq "ATTR2"}.'#cdata-section')
{
$array2 += $version
}
它 return 是想要的结果。
然后我将每个数组中的匹配索引分组到一个新数组中 ($array3
):
PowerShell(第三个阵列)
$array3 = @()
for($i = 0; $i -lt $array.Length; $i++)
{
$array3 += $array[$i] + ", " + $array2[$i]
$i++
}
它 return 是想要的结果(见下文):
结果
Hello World, 0.0.0.0
(so on and so forth...)
但是,最后一个 for-loop
拒绝将 $array
和 $array2
的最后一个值添加到 $array3
。
$array.Length
告诉我 $array
和 $array2
的长度是 896 即使 只有 895 个元素。当我 return $array[896]
我得到零结果。当我 return $array[895]
它 return 是我要查找的最后一个值。
如果数组的长度确实是896,那么$i
应该停在895,对吧?所以,我假设它会获取最终值(索引为 895)。那么,为什么我的 for-loop
没有添加最终值?
您的 for
循环的直接问题是您已经指定 $i++
应该在循环签名 ($i = 0; $i -lt $array.Length; $i++
) 中的每次迭代后执行,但是随后您也在正文中手动调用 $i++
。
也就是说,真正的解决方案是首先不要将列拆分为 2 个数组。相反,当您第一次迭代它时,为 XML 中的每个 ROW
节点创建一个新对象:
# assign all output from `foreach` loop to `$array`
$array = foreach($row in $xmldata.RESULTS.ROW){
# create new object with the pertinent details as property values
[pscustomobject]@{
Name = $row.COLUMN.Where{ $_.NAME -eq "ATTR3"}.'#cdata-section'
Version = $row.COLUMN.Where{ $_.NAME -eq "ATTR2"}.'#cdata-section'
}
}
现在,$array
每个 ROW
节点将包含一个对象,每个节点都有自己的 Name
和 Version
属性