Although I like the Windows PowerShell ISE, I came across a problem related to scope. For many months, I’ve been fighting issues of elements in my scripts not clearing out between runs. What I have come to find out is that when you run a script in the ISE and the script completes, its scope is not destroyed. Here is an example.
In the above example, in the shell, I set a variable to the value of 100. Since this is done in the shell, this variable is stored in the global scope. By executing Get-Variable, I can see the value of a is 100.
Now let’s do the same thing in the ISE.
If I run Get-Variable in the ISE, I receive this:
So far, all is as expected. Now let’s execute a script in the ISE that changes the value of $a to 500 and then displays it:
Now let’s run Get-Variable again inside the ISE.
The Value of $a is still 500. I suspect this behavior is what has caused me a lot of head aches over the past few months. I now program with the ISE, but test in the shell by Dot Sourcing the function into the shell. When using the Shell, the Script scope is destroyed and you start with a blank slate each time you run your function.