PowerShell: break nested loops

break, loops, powershell

Solution

You do not add the colon when using `break` with a loop label. This line:

break :outer

should be written like this:

break outer

For a further demonstration, consider this simple script:

:loop while ($true)
{
    while ($true)
    {
        break :loop
    }
}

When executed, it will run forever without breaking. This script however:

:loop while ($true)
{
    while ($true)
    {
        break loop
    }
}

exits as it should because I changed `break :loop` to `break loop`.

Problem

There should be a `break` command in PowerShell that can exit nested loops by assigning a label. Just it doesn't work. Here's my code: ``` $timestampServers = @( "http://timestamp.verisign.com/scripts/timstamp.dll", "http://timestamp.comodoca.com/authenticode", "http://timestamp.globalsign.com/scripts/timstamp.dll", "http://www.startssl.com/timestamp" ) :outer for ($retry = 2; $retry -gt 0; $retry--) { Write-Host retry $retry foreach ($timestampServer in $timestampServers) { Write-Host timestampServer $timestampServer & $signtoolBin sign /f $keyFile /p "$password" /t $timestampServer $file if ($?) { Write-Host OK break :outer } } } if ($retry -eq 0) { WaitError "Digitally signing failed" exit 1 } ``` It prints the following: ``` retry 2 timestampServer http://timestamp.verisign.com/scripts/timstamp.dll Done Adding Additional Store Successfully signed and timestamped: C:\myfile.dll OK retry 1 timestampServer http://timestamp.verisign.com/scripts/timstamp.dll Done Adding Additional Store Successfully signed and timestamped: C:\myfile.dll OK ERROR: Digitally signing failed ``` What have I done wrong? Can I have goto and labels, please? Using Windows 7 and I guess PS 2.0. This script is supposed to run on PS 2 at least.

Original source