PowershellでネストされたForEachループに問題があります。まず、リスト1を反復処理する必要があります。リスト1のすべてのオブジェクトについて、リスト2を反復処理する必要があります。リスト2の類似オブジェクトを見つけたら、リスト1の次のオブジェクトに移動します。
私は休憩を試みました、私は続けようとしましたが、それは私のために機能しません。
Function checkLists() {
ForEach ($objectA in $listA) {
ForEach ($objectB in $listB) {
if ($objectA -eq $objectB) {
// Do something
// goto next object in list A and find the next equal object
}
}
}
}
a)PowerShellでブレーク/コンティニューは正確に何をしますか?
b)「問題」をどの程度克服する必要がありますか?
get-help about_break
で説明されているラベルを使用します。
A Break statement can include a label. If you use the Break keyword with
a label, Windows PowerShell exits the labeled loop instead of exiting the
current loop
そのようです、
foreach ($objectA in @("a", "e", "i")) {
"objectA: $objectA"
:outer
foreach ($objectB in @("a", "b", "c", "d", "e")) {
if ($objectB -eq $objectA) {
"hit! $objectB"
break :outer
} else { "miss! $objectB" }
}
}
#Output:
objectA: a
hit! a
objectA: e
miss! a
miss! b
miss! c
miss! d
hit! e
objectA: i
miss! a
miss! b
miss! c
miss! d
miss! e
Break/continueを使用した例を次に示します。内側のループでテストを反転し、Continueを使用して、テストが失敗するまでループを続けます。ヒットするとすぐに、内側のループを中断し、外側のループの次のオブジェクトに戻ります。
foreach ($objectA in @("a", "e", "i"))
{
"objectA: $objectA"
foreach ($objectB in @("a", "b", "c", "d", "e")) {
if ($objectB -ne $objectA)
{
"miss! $objectB"
continue
}
else {
"hit! $objectB"
break
}
}
}
objectA: a
hit! a
objectA: e
miss! a
miss! b
miss! c
miss! d
hit! e
objectA: i
miss! a
miss! b
miss! c
miss! d
miss! e
Do..untilループを使用します-その使用目的はまさにあなたが説明しているものです。
Function checkLists() {
ForEach ($objectA in $listA) {
$Counter = 0
Do {
$ObjectB = $listB[$Counter]
#other stuff
}
#Keep going until we have a match or reach end of array
Until (($objectA -eq $objectB) -or (($Counter+1) -eq $Listb.count()))
}
}
以下に簡単な例を示します。
#Example use of do..until
$i = 1
do {
$i++
write-Host $i
}
until ($i -eq 10)