次の方法で共有


about_Continue

簡単な説明

ステートメントがプログラム ループ、 continue ステートメント、 switch または trap ステートメントの先頭にプログラム フローをすぐに返す方法について説明します。

長い説明

ステートメントは continue 、現在の制御ブロックを終了し、完全に終了するのではなく、実行を続行する方法を提供します。 ステートメントはラベルをサポートしています。 ラベルは、スクリプト内のステートメントに割り当てる名前です。

ループで続行を使用する

ラベルなしステートメントはcontinue、または while ステートメントによって制御される最も内側のループの先頭にプログラム フローをforforeachdo直ちに返します。 ループの現在のイテレーションが終了し、ループは次のイテレーションで続行されます。

次の例では、変数が 5 の場合$ctr、プログラム フローはループのwhile先頭に戻ります。 その結果、5 を除く 1 から 10 までのすべての数値が表示されます。

while ($ctr -lt 10)
{
    $ctr += 1
    if ($ctr -eq 5)
    {
        continue
    }

    Write-Host -Object $ctr
}

ループを for 使用すると、 ステートメントで実行が <Repeat> 続行され、その後にテストが <Condition> 続きます。 次の例では、 のデクリメント$iがキーワード (keyword)の後continueに発生するため、無限ループは発生しません。

#   <Init>  <Condition> <Repeat>
for ($i = 0; $i -lt 10; $i++)
{
    Write-Host -Object $i
    if ($i -eq 5)
    {
        continue
        # Will not result in an infinite loop.
        $i--
    }
}

ラベル付きの continue をループで使用する

ラベル付きステートメントは continue 、イテレーションの実行を終了し、ターゲットを囲むイテレーションまたは switch ステートメント ラベルに制御を転送します。

次の例では、 が True の場合$conditionに最も内側forの が終了し、2 番目forのループが でlabelB反復処理が続行されます。

:labelA for ($i = 1; $i -le 10; $i++) {
    :labelB for ($j = 1; $j -le 10; $j++) {
        :labelC for ($k = 1; $k -le 10; $k++) {
            if ($condition) {
                continue labelB
            } else {
                $condition = Update-Condition
            }
        }
    }
}

switch ステートメントで continue を使用する

switchのラベル付けされていないcontinueステートメントは、現在switchのイテレーションの実行を終了し、 の先頭に制御を転送して、次のswitch入力項目を取得します。

1 つの入力項目 continue がある場合、ステートメント全体 switch が終了します。 入力が switch コレクションの場合、 はコレクションの switch 各要素をテストします。 は continue 現在のイテレーションを終了し、 は switch 次の要素で続行されます。

switch (1,2,3) {
  2 { continue }  # moves on to the next element, 3
  default { $_ }
}
1
3

トラップ ステートメントで continue を使用する

本体 trap でステートメントで実行された最後のステートメントが の場合、 continueトラップされたエラーは暗黙的に無視され、実行は発生の原因 trap となったステートメントの直後に続きます。

ループ、スイッチ、またはトラップの外部で続行を使用しないでください

を直接サポートするコンストラクトの外部で を使用する場合 continue (ループ、、trap)、switchPowerShell は、外側のコンストラクトの呼び出し履歴を検索します。 外側のコンストラクトが見つからない場合、現在の実行空間は静かに終了します。

これは、それをサポートする外側のコンストラクトの外側で誤って を使用 continue する関数とスクリプトが、 誤って呼び出し元を終了する可能性があることを意味します。

スクリプト ブロックなどのパイプライン内で ForEach-Object を使用するとcontinue、パイプラインが終了するだけでなく、実行空間全体が終了する可能性があります。

こちらもご覧ください