如何在powershell中打破嵌套的foreach循环

时间:2018-04-26 18:09:09

标签: powershell

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

First iteration: $node = a equals $item = a
Second iteration: $node = a not equals to $item = b.

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

{{1}}

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

2 个答案:

答案 0 :(得分:0)

我更改了您的示例代码,如下所示:

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

:Outer foreach ($item in $nodes_table) 
{
    foreach($node in $nodes_list)
    {
        Write-Output "item = $item, node = $node" # display values being compared
        if($node -eq $item)
        {
            Write-Output "$node hostname matches in vTM"
            break :Outer
        }           
    }
}

这会产生以下输出:

item = a, node = a
a hostname matches in vTM
item = b, node = a
item = b, node = b
b hostname matches in vTM
item = c, node = a
item = c, node = b
item = c, node = c
c hostname matches in vTM

让我觉得它的行为正确。

修改

正如Bruce Payette在下面的回答所指出的那样,我复制到上面的例子中的原始代码存在缺陷。 break :Outer语句不正确,因为中断的对象应该是空的或标签的名称。冒号(:)字符不应该在那里。 PowerShell忽略此错误,并且表现得好像break语句上没有标签,从而破坏内部循环,而不是外部循环。删除生成行break Outer的冒号,您将看到代码在外部循环的第一次迭代和内部循环的第一次迭代期间立即跳转到外部for循环的末尾

答案 1 :(得分:0)

这里有两个问题。首先,如果您有:Outer foreach(...之类的标签,则标签的名称只是Outer,因此当您在break语句中引用它时,您指定break Outer而非{{1 (可能只是一个错字)。其次,您需要使用break :Outer语句而不是continue语句。 break语句在下一次迭代时恢复执行。更新的代码如下所示:

continue