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 脚本,它将 ATTR2ATTR3 读取到两个单独的数组中:

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 节点将包含一个对象,每个节点都有自己的 NameVersion 属性