Subshells (by the Seashore?)
Yesterday’s post detailed some frustration I encountered running PowerShell in a subshell. Why was I running it in a subshell in the first place?
I’m glad you asked.
It all started a long time ago (well, a few years, but it felt like a long time.) I was developing my script the way many of us do: copy-and-pasting code from the script editor into the test window. As it got closer and closer to done, I started save-and-executing the file. All’s fine and dandy, except I failed to define a variable in the script itself. However, I did define it in my test window. When I ran the script, PowerShell’s scoping rules allowed the script to pluck the variable from the PowerShell.exe shell, and the script worked.
Until it didn’t, which was when I was demoing it.
Since then, I’ve always run my script testing PowerShell windows in a subshell. Upon creating the window I type
function prompt { “cmd /c powershell.exe –noprofile`n” }
That’s the test window’s root shell’s prompt. It reminds me that I’m at the bottom of the barrel, and one more ‘exit’ will close the window. Then, to start a shell, I run:
cmd /c powershell.exe
Yes, I suppose I could simply call PowerShell.exe –NoProfile, but there’s something reassuring about dropping to cmd.exe so there is no way the Variable: PSProvider can follow me around (or Function:, Alias:, etc.)