Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to force PowerShell script to throw if a required parameter is omitted?

Tags:

powershell

I would like the second function call in this script to throw an error:

function Deploy {  param(      [Parameter(Mandatory=$true)]     [ValidateNotNullOrEmpty()]     [string]$BuildName      )     Write-Host "Build name is: $BuildName"  }  Deploy "Build123"  Deploy #Currently prompts for input 

Prompting is great for using the script interactively, but this will also be executed by our build server.

Is my best bet just doing some custom validation with an if or something?

like image 494
Josh Earl Avatar asked Feb 29 '12 20:02

Josh Earl


People also ask

How do you make a parameter mandatory in PowerShell?

To make a parameter mandatory add a "Mandatory=$true" to the parameter description. To make a parameter optional just leave the "Mandatory" statement out. Make sure the "param" statement is the first one (except for comments and blank lines) in either the script or the function.

What is optional parameter in PowerShell?

By default, PowerShell parameters are optional. When a user does not submit arguments to a parameter, PowerShell uses its default value. If no default value exists, the parameter value is $null. This is not always desired. There are situations when default values simply do not make sense.

How do you pass parameters to a PowerShell script?

You can pass the parameters in the PowerShell function and to catch those parameters, you need to use the arguments. Generally, when you use variables outside the function, you really don't need to pass the argument because the variable is itself a Public and can be accessible inside the function.

How do you prompt a parameter in PowerShell?

You can use a mandatory parameter to prompt user input in the PowerShell script or function during the execution. Here is an example of function Name that asks for the user input when it is run. Copy function Name { param( [Parameter(Mandatory)] [string]$name ) Write-Output "Your name is $name." }


2 Answers

Once the parameter is marked as mandatory PowerShell will prompt for value. That said, if you remove the mandatory attribute then you can set a default value with a throw statement:

function Deploy {     param(         [Parameter()]         [ValidateNotNullOrEmpty()]         [string]$BuildName=$(throw "BuildName is mandatory, please provide a value.")     )      Write-Host "Build name is: $BuildName" } 
like image 88
Shay Levy Avatar answered Oct 20 '22 23:10

Shay Levy


@Emperor XLII has a nice comment in the question that I think can be a better answer for some use cases:

if you run powershell.exe with the -NonInteractive flag, missing mandatory parameters will cause an error and result in a non-zero exit code for the process.

The reasons to use this can be:

  1. You have a lot of such Mandatory=$true parameters and the cost is high to convert all of them.
  2. The script will be used both interactively and non-interactively, and when run interactively you do want to be prompted for missing parameters.
like image 28
ohw Avatar answered Oct 20 '22 22:10

ohw