Function parameters in PowerShell

12,230

Solution 1

In V1, it really is just a preference. Using the param statement has traditionally been more formal, but functionally it's the same thing.

You will probably see a lot more use of PARAM in PowerShell V2 because of the ability to add attributes to parameters, similar to attributes in C#.

param
(
[Parameter( Mandatory=$true,
            Position=0,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true)]
[Alias("name")]
[String]
$path
)

Here you can specify the parameter attribute and a bunch of arguments to that attribute. You can also specify aliases and a number of other validation requiremets.

Keith makes a couple of great points as well. You can use the param statement to pass parameters to annonymous scriptblocks (lambda expressions) or to a PS1 script.

Solution 2

param() is required to specify the parameters for a script file and for scriptblocks:

PS> $sb = {param($x,$y) $x + $y}
PS> &$sb 1 3
4

Having it also be available for traditional functions is just a consistency thing IMO. It is nicer for advanced functions which tend to have a lot of baggage, er metadata, per parameter.

Solution 3

Possibly as a consistency measure? Always specifying parameters the same way improves readability.

Share:
12,230
Mike Shepard
Author by

Mike Shepard

Solutions Architect for Jack Henry & Associates (after being a DBA for 10 years).

Updated on June 17, 2022

Comments

  • Mike Shepard
    Mike Shepard almost 2 years

    Is there any reason to use the "Param( ... )" construction inside a function definition?

    My understanding is that you should use this for specifying parameters to scripts (and scriptblocks). I see a lot of examples on the web with parameters listed this way instead of just listing the parameters after the function name.

    Example:

    function Foo([string]$Bar){
       #Body of function
    }
    

    Or,

    function Foo{
         Param([string]$Bar)
    
    }