Using Parameter Attributes: Mandatory and ValidateSet in PowerShell
📖 Scenario: You are creating a PowerShell script to manage user roles in a small company. The script will accept a username and a role to assign. To avoid errors, you want to make sure the username is always provided and the role is one of the allowed options.
🎯 Goal: Build a PowerShell script that uses parameter attributes Mandatory and ValidateSet to ensure the user inputs a username and selects a valid role from a predefined list.
📋 What You'll Learn
Create a function called Set-UserRole with parameters Username and Role.
Make the Username parameter mandatory.
Restrict the Role parameter to only accept Admin, User, or Guest using ValidateSet.
Print a confirmation message showing the username and assigned role.
💡 Why This Matters
🌍 Real World
Scripts often need to ensure users provide required information and select valid options to avoid mistakes.
💼 Career
Knowing how to enforce parameter rules helps create reliable and user-friendly automation scripts in IT and DevOps roles.
Progress0 / 4 steps
1
Create the function with parameters
Write a PowerShell function named Set-UserRole with two parameters: Username and Role. Do not add any attributes yet.
PowerShell
Hint
Define the function and list the parameters inside param().
2
Make the Username parameter mandatory
Add the [Parameter(Mandatory=$true)] attribute to the Username parameter inside the param() block.
PowerShell
Hint
Use [Parameter(Mandatory=$true)] just before $Username.
3
Restrict Role parameter with ValidateSet
Add the [ValidateSet('Admin','User','Guest')] attribute to the Role parameter inside the param() block.
PowerShell
Hint
Use [ValidateSet('Admin','User','Guest')] just before $Role.
4
Print confirmation message
Inside the function body, add a Write-Host statement that prints: "User <Username> assigned role <Role>" using the parameters.
PowerShell
Hint
Use Write-Host "User $Username assigned role $Role" inside the function.
Practice
(1/5)
1. What does the [Parameter(Mandatory=$true)] attribute do in a PowerShell script parameter?
easy
A. It limits the parameter to specific allowed values.
B. It sets a default value for the parameter.
C. It makes the parameter optional.
D. It makes the parameter required when running the script.
Solution
Step 1: Understand the Mandatory attribute
The Mandatory=$true setting means the parameter must be provided by the user when running the script.
Step 2: Differentiate from other attributes
Unlike ValidateSet, which restricts values, Mandatory only requires the parameter to be present.
Final Answer:
It makes the parameter required when running the script. -> Option D
Quick Check:
Mandatory = required parameter [OK]
Hint: Mandatory means you must provide the parameter value [OK]
Common Mistakes:
Confusing Mandatory with ValidateSet
Thinking Mandatory sets default values
Assuming Mandatory makes parameter optional
2. Which of the following is the correct syntax to restrict a mandatory parameter to only accept the values 'Red', 'Green', or 'Blue' in PowerShell?
easy
A. [Parameter(Mandatory=$true)][ValidateSet('Red','Green','Blue')]$Color
B. [ValidateSet('Red','Green','Blue')][Parameter()]$Color
C. [Parameter()][ValidateSet('Red','Green','Blue')]$Color
D. [ValidateSet('Red','Green','Blue')]$Color
Solution
Step 1: Check attribute order and syntax
Both Parameter and ValidateSet attributes can be used together. The order does not affect functionality, but the common style is to put Parameter first.
Step 2: Confirm Mandatory and ValidateSet usage
[Parameter(Mandatory=$true)][ValidateSet('Red','Green','Blue')]$Color correctly uses Mandatory=$true and ValidateSet with the allowed values.
Final Answer:
[Parameter(Mandatory=$true)][ValidateSet('Red','Green','Blue')]$Color -> Option A
But when running the script without the -Size argument, it does not prompt for input and continues silently. What is the likely cause?
medium
A. The parameter type should be [int] instead of [string].
B. The script is missing CmdletBinding() to enable parameter validation.
C. Mandatory parameters never prompt for input automatically.
D. The ValidateSet attribute is incorrect and disables Mandatory.
Solution
Step 1: Understand Mandatory prompt behavior
Mandatory parameters prompt for input only if the function or script uses CmdletBinding() or is an advanced function.
Step 2: Identify missing CmdletBinding()
Without CmdletBinding(), 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 B
Quick Check:
CmdletBinding() enables Mandatory prompts [OK]
Hint: Add CmdletBinding() to enable Mandatory prompts [OK]
Common Mistakes:
Thinking ValidateSet disables Mandatory
Assuming Mandatory never prompts
Changing parameter type unnecessarily
5. You want to create a script parameter that is required and only accepts the values 'Start', 'Stop', or 'Restart'. Which of the following parameter declarations correctly enforces both requirements and will prompt the user if the parameter is missing?
hard
A. [CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[ValidateSet('Start','Stop','Restart')]
[string]$Action
)
B. param(
[Parameter()]
[ValidateSet('Start','Stop','Restart')]
[string]$Action = 'Start'
)
C. [CmdletBinding()]
param(
[Parameter()]
[ValidateSet('Start','Stop','Restart')]
[string]$Action
)
D. param(
[Parameter(Mandatory=$true)]
[string]$Action
)
Solution
Step 1: Ensure Mandatory prompts user
To prompt the user when a parameter is missing, the script must use CmdletBinding() and set Mandatory=$true.
Step 2: Restrict values with ValidateSet
Using ValidateSet limits 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
) includes CmdletBinding(), Mandatory=$true, and ValidateSet, fulfilling all requirements.
Final Answer:
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[ValidateSet('Start','Stop','Restart')]
[string]$Action
) -> Option A