我有一个奇怪的问题,我使用多个for循环并使用基于循环作为索引的对象属性构建的字符串填充arraylist。
我发现如果我Write-Host
我将所有这些行添加到arraylist中。屏幕上打印的内容正是我想要在arraylist中看到的,但是当我使用类似的东西遍历数组列表时:
foreach ($r in $Result) {
Write-Host -ForegroundColor Yellow "Object: $r"
}
我在arraylist中看到了大量我不期待的条目。我不知道为什么。我在这里发布了这个功能:
function Process-Config () {
param(
[string]$XMLPath
)
# Validate Parameters
if (Test-Path $XMLPath) { } else { exit }
Add-Type -path C:\Users\user\Downloads\ChilkatDotNet2-9.5.0-x64\ChilkatDotNet2-9.5.0-x64\ChilkatDotNet2.dll
$xml1 = New-Object Chilkat.Xml
$success = $xml1.LoadXmlFile($XMLPath)
if ($success -ne $true) {
$($xml.LastErrorText)
exit
}
$("NumChildren = " + $xml1.NumChildren)
Write-Host -ForegroundColor yellow "here"
# Array list that holds each string so it can be compared later on
$ResponseStrings = New-Object System.Collections.ArrayList
# Iterate over the direct children by index. The first child
# is at index 0.
for ($i = 0; $i -le $xml1.NumChildren - 1; $i++) {
$output = $("$i : $($xml1.GetChildTagByIndex($i)) : $($xml1.GetChildContentByIndex($i))")
Write-Host -ForegroundColor yellow "Top Level"
Write-Host -foregroundcolor green "Adding::::: $output"
$ResponseStrings.Add($output)
$xml2 = $xml1.GetChild($i)
for ($j = 0; $j -le $xml2.NumChildren -1; $j++) {
if ($xml2.GetChildContentByIndex($j) -eq $null -or $xml2.GetChildContentByIndex($j) -eq ""){
$xml3 = $xml2.GetChild($j)
for ($k = 0; $k -le $xml3.numchildren -1; $k++){
if ($xml3.GetChildContentByIndex($k) -eq $null -or $xml3.GetChildContentByIndex($k) -eq "") {
$xml4 = $xml3.GetChild($k)
for ($l = 0; $l -le $xml4.NumChildren -1; $l++) {
if ($xml4.GetChildContentByIndex($l) -eq $null -or $xml4.GetChildContentByIndex($l) -eq "") {
$xml5 = $xml4.GetChild($l)
for ($m = 0; $m -le $xml5.NumChildren -1; $m++){
if ($xml5.GetChildContentByIndex($m) -eq $null -or $xml5.GetChildContentByIndex($m) -eq "") {
$xml6 = $xml5.GetChild($m)
for ($n = 0; $n -le $xml6.NumChildren -1; $n++) {
$Output = $("$i : $($xml1.GetChildTagByIndex($i)) :: $($xml2.GetChildTagByIndex($j)) :: $($xml3.GetChildTagByIndex($k)) $($xml4.GetChildTagByIndex($l)) :: $($xml5.GetChildTagByIndex($m)) $($xml5.GetChildTagByIndex($m)) :: $($xml6.GetChildTagByIndex($n)) : $($xml6.GetChildContentByIndex($n)))")
Write-Host -ForegroundColor Green "adding::::: $output"
$ResponseStrings.Add($output)
}
}
$output = $("$i : $($xml1.GetChildTagByIndex($i)) :: $($xml2.GetChildTagByIndex($j)) :: $($xml3.GetChildTagByIndex($k)) $($xml4.GetChildTagByIndex($l)) :: $($xml5.GetChildTagByIndex($m)) : $($xml5.GetChildContentByIndex($m))")
Write-Host -ForegroundColor Green "adding::::: $output"
$ResponseStrings.Add($output)
}
}
$output = $("$i : $($xml1.GetChildTagByIndex($i)) :: $($xml2.GetChildTagByIndex($j)) :: $($xml3.GetChildTagByIndex($k)) :: $($xml4.GetChildTagByIndex($l)) : $($xml4.GetChildContentByIndex($l))")
Write-Host -ForegroundColor Green "adding::::: $output"
$ResponseStrings.Add($output)
}
}
$output = $("$i : $($xml1.GetChildTagByIndex($i)) :: $($xml2.GetChildTagByIndex($j)) :: $($xml3.GetChildTagByIndex($k)) : $($xml3.GetChildContentByIndex($k))")
Write-Host -ForegroundColor Green "adding::::: $output"
$ResponseStrings.Add($output)
}
}
$output = $("$i : $($xml1.GetChildTagByIndex($i)) :: $($xml2.GetChildTagByIndex($j)) : $($xml2.GetChildContentByIndex($j))")
Write-Host -ForegroundColor Green "adding::::: $output"
$ResponseStrings.Add($output)
}
}
return $ResponseStrings
}
如果有人可以看看并解释为什么阵列中有如此多的孤立对象,而不是我想添加的对象,我将不胜感激。
答案 0 :(得分:0)
当Add()
向ArrayList
发送内容时,它会发出元素的索引:
PS C:\> $ArrayList = New-Object System.Collections.ArrayList
PS C:\> $ArrayList.Add("something")
0
PS C:\> $ArrayList.Add("somemore")
1
我认为这些整数就是你所说的"孤儿"你的功能的输出。
您可以通过多种方式抑制ArrayList.Add()
的输出:
# cast to [void]
[void]$ResponseStrings.Add($output)
# assign to null
$null = $ResponseStrings.Add($output)
# pipe to null
$ResponseStrings.Add($output) | Out-Null
或者,使用ArrayList
以外的其他内容!
使用简单数组:
[array]$ResponseStrings += $output
$ResponseStrings = New-Object System.Collections.Generic.List[string]
for ($i = 0; $i -le $xml1.NumChildren - 1; $i++){
# this is now safe, List<string>.Add() doesn't return anything
$ResponseStrings.Add($output)
# ... and so on
}