Why Won’t My Custom Cmdlets Appear?

Once again, I’ve been puzzled multiple times as to why my custom cmdlets sometimes don’t appear in PowerShell after I’ve added them via Add-PSSnapIn.  The last post didn’t stick with me, so a little more detail to drill it into my thick skull this time…

As it turns out, Cmdlets must have a public default constructor, of course!   I sometimes forget this step when I’m in my TDD rhythm.  So something like this:

 using System.Management.Automation;

namespace MyCmdlets
{
    [Cmdlet(VerbsCommon.New, "DooDad")]
    public class NewDooDadCommand : MyBaseCommand
    {
        [Parameter(Position = 0, Mandatory = true)]
        public string MyData { get; set; }

        private readonly IDooDadFactory _dooDadFactory;
         public NewDooDadCommand(IDooDadFactory dooDadFactory )
        {
            _dooDadFactory = dooDadFactory;
        }

        ...
    }
}

Should really look more like this:

 using System.Management.Automation;

namespace MyCmdlets
{
    [Cmdlet(VerbsCommon.New, "DooDad")]
    public class NewDooDadCommand : MyBaseCommand
    {
        [Parameter(Position = 0, Mandatory = true)]
        public string MyData { get; set; }

        private readonly IDooDadFactory _dooDadFactory;
         /// <summary>
        /// Need this public default constructor
        /// </summary>
        public NewDooDadCommand()
            :this(ServiceLocator.GetInstance<IDooDadFactory>())
        {}
         public NewDooDadCommand(IDooDadFactory dooDadFactory )
        {
            _dooDadFactory = dooDadFactory;
        }

        ...
    }
}