Alisdair Craik

Alisdair Craik

N/A

Powershell Tutorial – Creating an endless loop, avoiding a call depth overflow

Sometimes when scripting you need to create a never ending loop while your script either waits for some other task to complete or repeats a task over and over again. There are two ways people tend to go about creating loops in Powershell, but one of them will eventually leave your script in a heap.

What not to do – a self referencing function:

When people are first starting out in Powershell, they tend to make loops with self-referencing functions. It’s the logical thing to do – run a function and, if it doesn’t turn out the way you wanted it to, run the function again. Take the example below:

Function Count-Up
{
    if($i -lt 9999)
    {
        $i++
        Count-Up
    }
    else
    {
        Write-Host “Count complete - We have counted up to $i”
    }
}

The problem with this is that you aren’t really creating a loop – it’s actually a spiral. Each time the Count-Up function is executed by the If statement it is actually running within the previous Count-Up function. Eventually, and in this case quite quickly, you end up with a spiral so deep PowerShell decides to bail out. At that point you get a “call depth overflow” and Powershell merrily ploughs on with the rest of your script.

The Right Way – using the While statement:

The correct way to build a loop is to use the inbuilt statement While. With a While loop, While replaces the If statement and the loop will continue to run while the statement evaluates to true, removing the need to re-reference the function (and accidentally create a spiral). This is the previous example re-written for a While statement:

Function Count-Up
{
    while($i -lt 9999)
    {
        $i++
    }
 
    Write-Host “Count complete - We have counted up to $i”
}

Notice we have also got rid of the Else statement. A While loop will continue to run until the statement is no longer true, so it doesn’t require Else statements (or support them) – we can be sure that the line after the loop will only run once the loop has completed.

Creating a truly endless function:

Sometimes you will want a truly endless function, that will run and run until the PowerShell session is closed. This is acheived simply by providing the While statement a condition that is always true. In PowerShell this looks like this:

while($true)
{
    $i++
    Write-Host “We have counted up to $i”
}
<< Back To The Blog