如何在powershell中中断嵌套的foreach循环

Sha*_*boz 2 powershell

我有两个长度相同的列表。我需要进行迭代,以便列表 A 中的第一项与列表 B 中的第一项匹配。为此,我创建了一个嵌套的 foreach 循环,如下所示:

$nodes_table = "a","b","c"
$nodes_list = "a","b","c"

     :Outer foreach ($item in $nodes_table) {
        foreach($node in $nodes_list)
        {
            if($node -eq $item)
            {
                Write-Output "$node hostname matches in vTM"
                break :Outer
            }           
        }        
    }
Run Code Online (Sandbox Code Playgroud)

问题: 在第一次迭代中,它匹配。但在第二次迭代中,内部循环不会转到第二项,而是再次重置。

First iteration: $node = a equals $item = a
Second iteration: $node = a not equals to $item = b.
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,在第二次迭代中,内循环没有迭代,它重置回a。

Bru*_*tte 6

这里有两个问题。首先,如果您有一个像:Outer foreach(...标签名称一样的标签,Outer那么当您在语句中引用它时break,您指定break Outer不是break :Outer(可能只是一个拼写错误)。其次,你需要使用continue声明而不是break声明。该continue语句在下一次迭代时恢复执行。更新后的代码如下所示:

$nodes_table = "a","b","c"
$nodes_list = "a","b","c"

:Outer foreach ($item in $nodes_table) {
    foreach($node in $nodes_list)
    {
        if($node -eq $item)
        {
            Write-Output "$node hostname matches in vTM"
            continue Outer
        }           
    }        
}
Run Code Online (Sandbox Code Playgroud)

  • 不会。如果您使用“break”运行上述代码,则只会发出第一个匹配项。如果您使用“继续”运行它,则将打印所有三个匹配项。只有当您的代码 **使用无效标签** `:Outer` 以冒号开头时,它看起来才一样。完全删除 Break/Continue 语句将产生相同的结果,因为内部循环和外部循环都会运行到完成。但目标是在匹配时短路内部循环,因此您需要使用带有正确标签的“继续”。 (2认同)