Parameter attributes help control how users give input to your script. Mandatory makes sure a value is given. ValidateSet limits input to specific choices.
Parameter attributes (Mandatory, ValidateSet) in PowerShell
param(
[Parameter(Mandatory=$true)]
[ValidateSet('Option1', 'Option2', 'Option3')]
[string]$ParameterName
)Mandatory=$true means the user must provide this parameter.
ValidateSet lists allowed values; PowerShell will error if input is outside this set.
$Name must be provided by the user.param(
[Parameter(Mandatory=$true)]
[string]$Name
)$Color only accepts 'Red', 'Green', or 'Blue'.param(
[ValidateSet('Red', 'Green', 'Blue')]
[string]$Color
)$Action is required and must be one of the three options.param(
[Parameter(Mandatory=$true)]
[ValidateSet('Start', 'Stop', 'Restart')]
[string]$Action
)This script requires the user to provide an $Operation parameter. It must be 'Add', 'Remove', or 'Update'. The script then prints the chosen operation.
param(
[Parameter(Mandatory=$true)]
[ValidateSet('Add', 'Remove', 'Update')]
[string]$Operation
)
Write-Output "You chose the operation: $Operation"If a mandatory parameter is missing, PowerShell will prompt the user to enter it.
Using ValidateSet helps prevent typos and invalid inputs.
You can combine Mandatory and ValidateSet to make sure input is both required and valid.
Mandatory makes a parameter required.
ValidateSet limits input to specific allowed values.
Together, they help make scripts safer and easier to use.
Practice
[Parameter(Mandatory=$true)] attribute do in a PowerShell script parameter?Solution
Step 1: Understand the Mandatory attribute
TheMandatory=$truesetting means the parameter must be provided by the user when running the script.Step 2: Differentiate from other attributes
UnlikeValidateSet, which restricts values,Mandatoryonly requires the parameter to be present.Final Answer:
It makes the parameter required when running the script. -> Option DQuick Check:
Mandatory = required parameter [OK]
- Confusing Mandatory with ValidateSet
- Thinking Mandatory sets default values
- Assuming Mandatory makes parameter optional
Solution
Step 1: Check attribute order and syntax
BothParameterandValidateSetattributes can be used together. The order does not affect functionality, but the common style is to putParameterfirst.Step 2: Confirm Mandatory and ValidateSet usage
[Parameter(Mandatory=$true)][ValidateSet('Red','Green','Blue')]$Color correctly usesMandatory=$trueandValidateSetwith the allowed values.Final Answer:
[Parameter(Mandatory=$true)][ValidateSet('Red','Green','Blue')]$Color -> Option AQuick Check:
Correct syntax = [Parameter(Mandatory=$true)][ValidateSet('Red','Green','Blue')]$Color [OK]
- Swapping attribute order causing confusion
- Missing parentheses in ValidateSet
- Not setting Mandatory when required
function Test-Color {
param(
[Parameter(Mandatory=$true)]
[ValidateSet('Red','Green','Blue')]
[string]$Color
)
Write-Output "Color chosen: $Color"
}
Test-Color -Color YellowWhat will happen when you run this script?
Solution
Step 1: Understand ValidateSet behavior
TheValidateSetattribute restricts input to the listed values only. 'Yellow' is not in the set 'Red', 'Green', 'Blue'.Step 2: Predict script behavior on invalid input
Passing 'Yellow' causes a validation error and stops the script before output.Final Answer:
It throws a validation error because 'Yellow' is not in the ValidateSet. -> Option CQuick Check:
ValidateSet blocks invalid values [OK]
- Assuming script prompts instead of erroring
- Thinking it ignores invalid values
- Confusing Mandatory with ValidateSet behavior
param(
[Parameter(Mandatory=$true)]
[ValidateSet('Small','Medium','Large')]
[string]$Size
)But when running the script without the
-Size argument, it does not prompt for input and continues silently. What is the likely cause?Solution
Step 1: Understand Mandatory prompt behavior
Mandatory parameters prompt for input only if the function or script usesCmdletBinding()or is an advanced function.Step 2: Identify missing CmdletBinding()
WithoutCmdletBinding(), the script treats parameters as simple variables and does not enforce Mandatory prompts.Final Answer:
The script is missing CmdletBinding() to enable parameter validation. -> Option BQuick Check:
CmdletBinding() enables Mandatory prompts [OK]
- Thinking ValidateSet disables Mandatory
- Assuming Mandatory never prompts
- Changing parameter type unnecessarily
Solution
Step 1: Ensure Mandatory prompts user
To prompt the user when a parameter is missing, the script must useCmdletBinding()and setMandatory=$true.Step 2: Restrict values with ValidateSet
UsingValidateSetlimits input to the allowed values 'Start', 'Stop', or 'Restart'.Step 3: Check all options
[CmdletBinding()] param( [Parameter(Mandatory=$true)] [ValidateSet('Start','Stop','Restart')] [string]$Action ) includesCmdletBinding(),Mandatory=$true, andValidateSet, fulfilling all requirements.Final Answer:
[CmdletBinding()] param( [Parameter(Mandatory=$true)] [ValidateSet('Start','Stop','Restart')] [string]$Action ) -> Option AQuick Check:
CmdletBinding + Mandatory + ValidateSet = [CmdletBinding()] param( [Parameter(Mandatory=$true)] [ValidateSet('Start','Stop','Restart')] [string]$Action ) [OK]
- Omitting CmdletBinding() so no prompt occurs
- Setting default value disables Mandatory prompt
- Not using ValidateSet to restrict values
Ready to prove it?
Pass the test and this pattern moves unknown
