Functions in PowerShell provide a way to encapsulate pieces of reusable code. Defining parameters allows passing input data into functions, enabling more flexible and reusable code. This comprehensive guide covers various methods for passing multiple parameters to PowerShell functions from a full-stack developer perspective.
What are Parameters in PowerShell Functions?
Parameters act as variables that allow passing data into a function when it is called. The function can then use the parameter values in its code body to process the input data and return outputs.
Parameters make functions more versatile since different data can be passed in to create different results. Functions without parameters would have hard-coded data values embedded in the function body.
Benefits of Using Parameters
Defining parameters on functions has several advantages:
- Reusability – parameters allow flexible data inputs
- Encapsulation – hides implementation details from consumer
- Testability – Functions can be tested with different parameter values
- Readability – Functions‘ signatures show their inputs
- Maintainability – reduces hard-coded dependencies
A 2021 survey of 100 open-source PowerShell projects on GitHub found 89% defined functions using parameters, illustrating it as a very common technique.
Ways to Define Function Parameters
There are two main ways to define parameters that a PowerShell function accepts:
1. Param Statement
The Param statement explicitly lists out parameters and associated attributes:
function Get-User {
[CmdletBinding()]
Param (
[Parameter(Mandatory=$true)]
[string]$UserName
)
# Function body
}
2. $Args Automatic Variable
The $args
array variable contains values passed to a function:
function Get-User {
$UserName = $Args[0]
# Function body
}
$Args is convenient but lacks parameter validation available in Param statement.
When to use each approach
Most PowerShell style guides recommend using the Param statement when defining non-trivial functions. Key reasons:
- Enables parameter validation
- Documents parameters and their requirements
- Supports help generation
- Works with parameter binding
$Args may be suitable for:
- Simple helper functions
- Quick tests
- Just need to access values by position
So for reusable production code, the Param statement approach is typically preferred.
Parameter Data Types
Specifying parameter data types isn‘t required but can help validate proper input is passed:
function Test-Object {
Param (
[hashtable]$InputObject
)
# Validate $InputObject is hashtable inside function
}
We can use built-in .NET types like [int], [string], [datetime], [bool] and more.
PowerShell also allows custom types or more complex types like arrays, references, or hash tables:
function Get-Users {
Param (
[Array]$UserNames
)
# Process array of user names
}
So parameter data types enable consistency of inputs.
Common Parameter Data Types
.NET Type | Description | Example |
---|---|---|
[string] | Text string | [string]$Name |
[int] | Integer number | [int]$Count |
[bool] | Boolean True/False | [bool]$Enabled |
[datetime] | Date & time | [datetime]$StartTime |
[hash table] | Dictionary object | [hashtable]$Attributes |
[array] | List object | [array]$Values |
Parameter Attributes
Along with data types, attributes provide additional functionality:
Common Parameter Attributes
Attribute | Description | Example |
---|---|---|
Mandatory | Parameter required | Mandatory=$true |
Position | Assign parameter position | Position=0 |
ParameterSet | Allow parameter sets | ParameterSetName |
ValidateSet | Allowed values list | ValidateSet("A","B") |
function Get-Record {
Param (
[Parameter(Mandatory=$true,
Position=0)]
[int]$Id,
[Parameter(ParameterSetName="ByName")]
[string]$Name
)
# Function body
}
Here Id is a required integer parameter while the Name parameter applies only to ByName parameter set.
So attributes enable more control over parameter inputs.
Parameter Splatting
Splatting allows passing a group of parameters to a command or function using a hashtable:
$Params = @{
UserName = "John"
enabled = $true
}
Get-User @Params
The splatted hashtable is bound to the function parameters based on parameter name match.
Splatting keeps parameter passing cleaner by consolidating groups of parameters.
Parameter Sets
Parameter sets allow specifying groups of parameters that can be used together:
function Get-User {
[CmdletBinding(DefaultParameterSet = "ById")]
Param (
[Parameter(ParameterSetName="ById", Position=0)]
[int]$UserId,
[Parameter(ParameterSetName="ByName")]
[string]$UserName
)
}
Here we defined mutually exclusive Id and Name parameters into separate parameter sets. DefaultParameterSet defines the default.
Parameter sets enable multiple parameter combinations on the same function.
Best Practices for Parameters
When defining function parameters, consider adopting standard guidelines on naming, organization, scope, etc.
PowerShell Style Guide Recommendations
- Use PascalCase for parameter names
- Prefix boolean parameters with Enable/Disable
- Pluralize collection parameter names
- Put required parameters before optional ones
- Scope parameters narrowly to minimize variables
Following conventions optimizes readability, alignment and design.
Comparison to Parameters in Other Languages
Similar to PowerShell, languages like C#, Python, JavaScript also support function parameters:
PowerShell vs Other Languages
Feature | PowerShell | C# | Python | JavaScript |
---|---|---|---|---|
Typed Parameters | Yes | Yes | Yes | No |
Default values | Yes | Yes | Yes | Yes |
Parameter attributes | Yes | Partial | Partial | No |
Parameter sets | Yes | No | No | No |
Mandatory parameters | Yes | No | No | No |
So while PowerShell has similarities, it also provides additional native parameter handling capabilities.
Passing Multiple Parameters – Examples
Now that we‘ve seen ways to define parameters along with their options, let‘s look at examples passing multiple parameters to functions:
1. Using Param Statement
With named parameters:
function Get-FullName {
param (
[string]$FirstName,
[string]$LastName
)
return "$FirstName $LastName"
}
Get-FullName -FirstName John -LastName Smith
Or with positional parameters:
Get-FullName John Smith
2. Using $Args automatic variable
With $args, arguments are passed based purely on position:
function Get-Name {
$First = $Args[0]
$Last = $Args[1]
return "$First $Last"
}
Get-Name John Smith
So both styles enable passing multiple values, with Param having more features.
Validating Parameters
Additional validation can enhance reliability:
ValidateSet – Allow only specified values:
Param (
[ValidateSet(‘A‘,‘B‘)]
[string]$Option
)
ValidatePattern – Check regex pattern:
Param (
[ValidatePattern(‘^[0-9]{5}$‘)]
[string]$ZipCode
)
ValidateRange – Check in range:
Param (
[ValidateRange(0,10)]
[int]$Rank
)
There are many other built-in and custom validators available.
Summary
Defining multiple parameters enables passing flexible data into PowerShell scripts, vital for reusable functions. The Param statement provides the most control through typed parameters, attributes like mandatory and validation, and parameter sets to allow multiple input combinations. Following standard naming conventions optimizes readability and usage. Overall, parameters are a key aspect of authoring robust reusable PowerShell functions.