In part one of this post, I indicated three different ways to populate the $PSDefaultParameterValues preference variable. The $PSDefaultParameterValues variable allow one to assign default values to the parameters of cmdlets and functions without ever needing to type them when they invoke the cmdlet or function. Here’s the two sets of examples from that post.
$PSDefaultParameterValues.Add('Get-Help:ShowWindow',$true) $PSDefaultParameterValues = @{'Get-Help:ShowWindow' = $true} $PSDefaultParameterValues['Get-Help:ShowWindow'] = $true $PSDefaultParameterValues.Add('Out-Default:OutVariable','__') $PSDefaultParameterValues = @{'Out-Default:OutVariable' = '__'} $PSDefaultParameterValues['Out-Default:OutVariable'] = '__'
In the first section of the above example, we set the ShowWindow parameter of Get-Help to $true. Now, whenever I use Get-Help, it will always include the ShowWindow parameter, and I don’t have to type a thing. Keep in mind, if it’s not clear, that the first three commands all do the same thing. You’d only need to run one of them. The same goes for the second section of the above example.
So, I recently wrote a function at work. It’s another PowerShell random password generator, as if the world needed one more. In my version, there’s a CharacterType parameter that can accept one or more of four predefined values: Lowercase, Number, Symbol, and Uppercase. These values can be used alone, or in combination with each other. As I have a coworker that didn’t want symbols, I obliged by adding this character type feature. I should mention that if the CharacterType parameter isn’t included at all, that it will default to use all four character types. As it should.
Now, my coworker doesn’t have to type the below command over and over in order to include three of the four possible values, every time.
PS > New-RandomPassword -CharacterType Lowercase,Number,Uppercase
That’s when it dawned on me. I’m not sure I’ve ever used the $PSDefaultParameterValues preference variable with multiple parameter values. It’s up there, but to review, the function is New-RandomPassword, and the parameter where we want default values is called CharacterType. The default values we always want included are Lowercase, Number, and Uppercase. As you’d expect, we’re avoiding symbols in our random passwords for this example.
$PSDefaultParameterValues = @{'New-RandomPassword:CharacterType'='Number','Uppercase','Lowercase'} $PSDefaultParameterValues['New-RandomPassword:CharacterType'] = 'Number','Uppercase','Lowercase' $PSDefaultParameterValues.Add('New-RandomPassword:CharacterType',@('Number','Uppercase','Lowercase'))
Although you’d only need to run one of them, each of the above examples will modify $PSDefaultParameterValues the identical way.
PS > $PSDefaultParameterValues | Format-Table -AutoSize Name Value ---- ----- New-RandomPassword:CharacterType {Number, Uppercase, Lowercase}
Now, whenever New-RandomPassword is invoked (on a system where this entry is a part of $PSDefaultParameterValues, obviously), it’ll include those values, for that parameter, without the need to actually type the parameter name and the values — neat. As of now, I can say I’ve include multiple values for a single parameter using the $PSDefaultParameterValues variable. You too, or at least you can say you know it’s an option.