PowerShell: break nested loops PowerShell: break nested loops powershell powershell

PowerShell: break nested loops


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.


So, I changed the code a bit to make it clear

$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 ($true)        {            break :outer            Write-Host OK        }    }}if ($retry -eq 0){    Write-Error "Digitally signing failed"  ## you have a typo there    exit 1}

This produces the following:

retry 2timestampServer http://timestamp.verisign.com/scripts/timstamp.dllretry 1timestampServer http://timestamp.verisign.com/scripts/timstamp.dllC:\temp\t.ps1 : Digitally signing failed    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,t.ps1

So, skips Write-Host OK, but also seems to continue to loop. In other words, it acts like 'Continue' statement.

Changed it like the folks mentioned to remove ':', although PowerShell documentation does not exclude it:

 if ($true)        {            break outer            Write-Host OK        }

I get the correct behavior.

retry 2timestampServer http://timestamp.verisign.com/scripts/timstamp.dll

Long story short... do not use ':'