仅在嵌套循环中跳出内循环

Break out of inner loop only in nested loop

我正在尝试实现一个中断,这样当我得到 xxxxx 次结果时就不必继续循环。

$baseFileCsvContents | ForEach-Object {
    # Do stuff
    $fileToBeMergedCsvContents | ForEach-Object {
        If ($_.SamAccountName -eq $baseSameAccountName) {
            # Do something
            break
        }
        # Stop doing stuff in this For Loop
    }
    # Continue doing stuff in this For Loop
}

问题是,break 正在退出两个 ForEach-Object 循环,而我只希望它退出内部循环。我试过读取和设置像 :outer 这样的标志,但是我得到的只是语法错误。

有人知道怎么做吗?

您将无法对 ForEach-Object 使用命名循环,但可以使用 ForEach 关键字代替,如下所示:

$OuterLoop = 1..10
$InnerLoop = 25..50

$OuterLoop | ForEach-Object {
    Write-Verbose "[OuterLoop] $($_)" -Verbose
    :inner
    ForEach ($Item in $InnerLoop) {
        Write-Verbose "[InnerLoop] $($Item)" -Verbose
        If ($Item -eq 30) {
            Write-Warning 'BREAKING INNER LOOP!'
            BREAK inner
        }
    }
}

现在,每当每个内循环达到 30 时,它就会跳转到外循环并继续。

使用 return 关键字有效,因为 "ForEach-Object" 将脚本块作为参数,然后为管道中的每个元素调用该脚本块。

    1..10 | ForEach-Object {
        $a = $_
        1..2 | ForEach-Object {
            if($a -eq 5 -and $_ -eq 1) {return}
            "$a $_"
        }
        "---"
    }

将跳过“5 1”