web-dev-qa-db-ja.com

PowerShellで入れ子になったForEach()

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)「問題」をどの程度克服する必要がありますか?

12
Jente

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
11
vonPryz

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
4
mjolinor

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)
1
Trondh