Thursday, August 19, 2010

PowerShell, Scripts and Cmd.exe

PowerShell's designers don't seem to be overly concerned about including intuitiveness as a feature.  Consider what it takes to run a PowerShell script from the cmd.exe prompt. Bet

c:\> Powershell blah blah

doesn't do what you would think it would do. PowerShell expects "blah blah" to be code written in Powershell.  the canonical example is the following:

c:\> Powershell 2+2
4

Get it?  Do you ever find yourself typing "Powershell blah blah" at the command line? I didn't think so.  PowerShell is a scripting language, so you might be expecting

c:\> Powershell script.ps1

to run a script named script.ps1. Well if so, you would be wrong. PowerShell instead expects "script.ps1" to be a PowerShell command, which it obviously isn't.  The solution, for some unexplained reason, is to add an ampersand in quotation marks. Thus,

c:\> Powershell "&" script.ps1

BTW, it's more conventional to put the script reference in quotation marks as well. In other words,

> Powershell "& script.ps1"

According to the error message you receive if you type

c:\> Powershell "& blah blah"

the quoted ampersand tells PowerShell that what comes afterward is one of four things:

  • cmdlet
  • function
  • script file
  • operable program
Apparently, this error message is the only official instruction from Microsoft regarding the ampersand switch.