У меня есть код, который, кажется, работает, поскольку он печатает то, что я ожидаю, но похоже, что есть по крайней мере один из многих операторов foreach. Изначально у меня были те же данные в JSON, но, чтобы заставить их работать с PS2, я думал, что XML упростит это. В сравнении с этим версия JSON показалась довольно простой. Код приведен ниже в качестве примера. Буду признателен за любой вклад, если это правильно. Я убежден, что должен быть способ получше.
$xmldata = [xml]@"
<?xml version = "1.0" encoding = "UTF-8"?>
<DATA>
<Components>
<ITEM1>
<name>
<element>test1</element>
</name>
<info1>
<element>info1-e1</element>
<element>info1-e2</element>
</info1>
<info2>
<element>info2-e1</element>
<element>info2-e2</element>
</info2>
</ITEM1>
<ITEM2>
<name>
<element>test2</element>
</name>
<info2>
<element>info2-e1</element>
<element>info2-e2</element>
</info2>
<info2>
<element>info2-e1</element>
<element>info2-e2</element>
</info2>
</ITEM2>
</Components>
</DATA>
"@
$xmldata | Select-Xml -XPath "//DATA/Components" | foreach {
foreach ($x in $_.node) {
foreach ($itemToProcess in $x.ChildNodes) {
Write-Host "Name:" $($itemToProcess.name.element)
#Process Info1
if ($itemToProcess.info1) {
foreach ($e in $itemToProcess.info1.element) {
Write-Host "`tElement:" $e
}
}
#Process Info2
if ($itemToProcess.info2) {
foreach ($e in $itemToProcess.info2.element) {
Write-Host "`tElement:" $e
}
}
}
}
}
Это ответ или я все еще упускаю хитрость? У меня на foreach меньше.
$l1 = 0
$l2 = 0
$xmldata | Select-Xml -XPath "//DATA/Components" | foreach {
foreach ($itemToProcess in $_.node.ChildNodes) {
Write-Host "Name:" $($itemToProcess.name.element)
#Process Info1
if ($itemToProcess.info1) {
foreach ($e in $itemToProcess.info1.element) {
Write-Host "`tElement:" $e
}
}
#Process Info2
if ($itemToProcess.info2) {
foreach ($e in $itemToProcess.info2.element) {
Write-Host "`tElement:" $e
}
}
$l2++
}
$l1++
}
Write-Host "Number of outer foreach" $l1
Write-Host "Number of inner foreach" $l2
Спасибо @AnsgarWiechers. Я ценю ваше время и вклад.





Подходящее место для критики рабочего кода - Проверка кода. Stack Overflow предназначен для того, чтобы задать вопрос о коде, который (пока) не работает. Но чтобы ответить на ваш вопрос: да, вложение одного итератора в другой итератор бессмысленно, когда оба они по сути обрабатывают одну и ту же коллекцию. Ваш второй пример кода эквивалентен вашему первому.