Last Update: Sep 04, 2024 | Published: Mar 26, 2020
Do you have that one PowerShell command you use constantly? If that command has parameters, you have to manually specify the parameter values every time. If you find yourself passing the same parameter values to a command frequently, this post is for you.
In this article, you’re going to learn a time-saving way to automatically provide common values to function or cmdlet parameters in PowerShell using the $PSDefaultParameterValues
automatic variable.
Let’s say you’re connecting to a lot of remote computers with the Invoke-Command
cmdlet. You have configured SSL for WinRM and are repeatedly having to use the parameters: UseSSL
and Port
. All of your Invoke-Command
references look like below. Notice that the ComputerName
parameter will change but the others will not.
Invoke-Command -Port 5986 -UseSSL $true -ComputerName [somecomputer]
Now you could continue to manually type -Port 5986 -UseSSL $true
for every, single Invoke-Command
reference but your enemy should be the word manual.
You need to figure out a way to automatically pass a static value to both the Port
and UseSSL
parameters. To do that, you have two options.
$PSDefaultParameterValues
automatic variable providing the command, parameters and their values.Proxy functions are more complex than option #2 so let’s stick to that one for this article.
The $PSDefaultParameterValues
automatic variable is a variable that contains a specifically structured hashtable. This hashtable defines command names, parameter names and their values. Before a command is invoked, PowerShell checks to see if the command exists in this variable. If so, it automatically passes the parameters provided in the variable.
$PSDefaultParameterValues
Adding to the $PSDefaultParameterValues
is exactly like adding to any other hashtable with a key and value. But, the key must be structured in the format [command_name]:[parameter_name]
with the value being the value to pass to the parameter.
Using the example above, let’s ensure -Port 5986 -UseSSL $true
is passed to every Invoke-Command
reference.
$PSDefaultParameterValues.Add("Invoke-Command:Port", 5986)
$PSDefaultParameterValues.Add("Invoke-Command:UseSSL", $true)
Now check the value of $PSDefaultParameterValues
and see what it looks like.
Now whenever you run Invoke-Command
, both of the provided parameters will be used.
Note that
$PSDefaultParameterValues
will only exist in the current PowerShell session. If you need to keep these settings, be sure to place the code to add the values in your PowerShell profile.
Perhaps you have multiple commands matching the same verb or noun to add parameter values to. Or maybe you have a single command with parameter names matching a particular pattern. In that case, you can also use wildcards when adding values.
Maybe you have some custom functions like Get-Server
, Add-Server
and New-Server
. Each of these functions has a parameter called Type
. Rather than adding a key/value pair for each of these functions, you could accomplish the same thing with a single entry.
$PSDefaultParameterValues.Add("*-Server:Type",'some_value')
Now any command ending with -Server
will be passed a parameter of Type
with a value of some_value
.
$PSDefaultParameterValues
Perhaps you’ve changed your mind and would rather not have the parameters automatically passed to Invoke-Command
. In that case, you could either remove the keys with $PSDefaultParameterValues.Remove()
or you could disable the functionality. Disabling the functionality allows you to keep the existing values.
To disable $PSDefaultParameterValues
, add a Disabled
key to the hashtable with a value of $true
.
$PSDefaultParameterValues['Disabled'] = $true
All previously added key/value pairs still exist but the functionality has simply been disabled.
Whenever you find yourself using the same parameters with the same values on a command, consider using the $PSDefaultParameterValues
automatic variable. It will cut down on repetitive typing and save your sanity!