What if your script could stop errors before they even start, just by asking the right questions?
Why Parameter attributes (Mandatory, ValidateSet) in PowerShell? - Purpose & Use Cases
Imagine you have a script that asks users to type in a color name. They have to type it exactly right every time. If they forget or type something wrong, the script just fails or gives confusing errors.
Manually checking if the user typed a value or if it matches allowed colors means writing extra code. This slows you down and can still let mistakes slip through, causing frustration and wasted time.
Using Parameter attributes like Mandatory and ValidateSet makes PowerShell ask for required inputs and only accept specific allowed values automatically. This keeps your script clean and user-friendly.
if (-not $color) { Write-Error 'Color is required' } if ($color -notin @('Red','Green','Blue')) { Write-Error 'Invalid color' }
[Parameter(Mandatory=$true)] [ValidateSet('Red','Green','Blue')] [string]$color
This lets your scripts guide users smoothly, preventing errors before they happen and making automation more reliable and professional.
When deploying a server, you can force the user to pick only valid environments like 'Dev', 'Test', or 'Prod' so the script never runs with wrong settings.
Parameter attributes ensure required inputs are provided.
ValidateSet restricts inputs to allowed choices automatically.
This reduces errors and simplifies your script code.
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
