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 ':'