Search code examples
functionpowershellparameterspowershell-cmdlet

Passing a cmdlet as a parameter


I need to restart a service in a powershell script. The problem is that this service is a bit buggy and frequently needs to be shut down several times before it gets into the "stopped" state. Because of that I can't seem to use the Restart-Service cmdlet, instead I need to retry the Stop-Service cmdlet a few times. The same applies to starting the service.

So I figure this is a good place to write a function that will take an action (start or stop) and retry it a few times until it works. The problem is I'm not sure how to pass the action in as a parameter. I could just have the action be a String and then say if action == "start" do starcAction, but that won't be very clean. Is there any way I could pass a cmdlet like Stop-Service in as a parameter?


Solution

  • Param([Parameter(Mandatory)] [ValidateSet('Start','Stop')] [string] $Action)
    

    This allows the user to press Tab to select the possible values and will automatically reject all invalid input.

    Passing in a well defined parameter (doesn't matter if it's a string or not) is actually cleaner than "passing in a commandlet" would be if there was such a thing.