+2  A: 

You could set an instance field bool (Init) to false in BeginProcessing. Then check to see if the parameter is set in BeginProcessing. If it is then call a method that does the one time init (InitMe). In ProcessRecord check the value of Init and if it is false, then call InitMe. InitMe should set Init to true before returning.

Regarding your second question, if you've marked the parameter as mandatory then it must be supplied either as a parameter or via the pipeline. Are you using multiple parameter sets? If so, then even if a parameter is marked as mandatory, it is only mandatory if the associated parameter set is the one that is determined by PowerShell to be in use for a particular invocation of the cmdlet.

Keith Hill
Thanks Keith. In hoping to avoid having to "special case" the ProcessRecord() with a one time run of the expensive code, I was hoping there was some other magical way to keep things "clean" in BeginProcessing(). I guess there doesn't seem to be. Thanks for your advice and also, thanks for your blog entry on on pipeline bound parameters by name. I'll link it in the question.
Scott Saad