Welcome to MSDN Blogs Sign in | Join | Help

How and Why to Use Splatting (passing [switch] parameters)

On our internal discussion list, someone just asked about how to pass switch parameters from one function to another.  This person asked this as "Why can't [switch] parameters be passed as parameters?".

My short answer was simple: "They Can Be"

Answering this question is a great way to illustrate the value of a PowerShell V2 feature called Splatting.  Splatting is two things, it's a way to get all of the parameters passed to a function automatically (they're in a variable, $psBoundParameters), and it's a way to take a list or dictionary of arguments and pass them on to the next function below.

The mistake of trying to pass along a switch parameter is a pretty easy one to make.  [switch] will let you specify the parameter by just passing -ParameterName instead of -ParameterName True.

When you try to pass on a value to another underlying function, -SwitchParameterInOtherFunction $switchParameterInThis function will set the switch to true in the underlying function, and then pass a positional parameter with the value of the switch parameter.

The V1 fix for this is to put a : between the parameter name and its value.  The V2 fix for this is to simply use splatting.   The important line below is in bold and italics.

V2: V1:

function test2($x, $y, [switch]$passThru) {
    "In Test 2"
    "x:"
    $x
    "y:"
    $y
    "passThru:"
    $passThru
}

function test1($x, $y, [switch]$passThru) {
    "In Test 1"
    Test2 @psBoundParameters
}

test1 "a" "b" -passThru

function test2($x, $y, [switch]$passThru) {
    "In Test 2"
    "x:"
    $x
    "y:"
    $y
    "passThru:"
    $passThru
}

function test1($x, $y, [switch]$passThru) {
    "In Test 1"
    Test2 -x:$x -y:$y -passThru:$passThru
}

test1 "a" "b" -passThru

So why use splatting?  Well, here was my answer to the question on our PowerShell Discussions alias:

Notice that with @psBoundParameters, I don’t have to specify the parameters on by one.   This is both more convenient (less typing) and less error prone (less chance of forgetting a parameter or adding a typo).

To see more powerful examples of splatting, you can check out Get-CommandPlugin and the CodeDownloader module.

Hope this Helps,

James Brundage [MSFT]

Published Friday, January 02, 2009 9:03 PM by PowerShellTeam
Filed under: ,

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

No Comments

Leave a Comment

(required) 
required 
(required) 

  
Enter Code Here: Required
 
Page view tracker