Search code examples
powershellparameters

Getting all Named Parameters from Powershell including empty and set ones


I'm trying to find a way to get all parameter information from a powershell script. Ex script:

function test()
{
    Param(
        [string]$foo,
        [string]$bar,
        [string]$baz = "baz"
    )

    foreach ($key in $MyInvocation.BoundParameters.keys)
    {
        write-host "Parameter: $($key) -> $($MyInvocation.BoundParameters[$key])"
    }
}
test -foo "foo!"

I'd like to get the values of $bar and $baz in a dynamic way without knowing the names of the parameters ahead of time.

I've looked through $MyInvocation properties and methods but I don't see anything besides parameters that are set/passed.

Update 1:

I'm close to getting it with:

function test()
{
    Param(
        [string]$foo,
        [string]$bar,
        [string]$baz = "baz"
    )
    foreach($var in (get-variable -scope private))
    {
        write-host "$($var.name) -> $($var.value)"
    }
}
test -foo "foo!"

If i could filter out the script parameters vs the default parameters I would be good to go.

Update 2: The final working solution looks like this:

function test {
    param (
          [string] $Bar = 'test'
        , [string] $Baz
        , [string] $Asdf
    )
    $ParameterList = (Get-Command -Name $MyInvocation.InvocationName).Parameters;
    foreach ($key in $ParameterList.keys)
    {
        $var = Get-Variable -Name $key -ErrorAction SilentlyContinue;
        if($var)
        {
            write-host "$($var.name) > $($var.value)"
        }
    }
}

test -asdf blah;

Solution

  • Check this solution out. This uses the CmdletBinding() attribute, which provides some additional metadata through the use of the $PSCmdlet built-in variable. You can:

    1. Dynamically retrieve the command's name, using $PSCmdlet
    2. Get a list of the parameter for the command, using Get-Command
    3. Examine the value of each parameter, using the Get-Variable cmdlet

    Code:

    function test {
        [CmdletBinding()]
        param (
              [string] $Bar = 'test'
            , [string] $Baz
            , [string] $Asdf
        )
        # Get the command name
        $CommandName = $PSCmdlet.MyInvocation.InvocationName;
        # Get the list of parameters for the command
        $ParameterList = (Get-Command -Name $CommandName).Parameters;
    
        # Grab each parameter value, using Get-Variable
        foreach ($Parameter in $ParameterList) {
            Get-Variable -Name $Parameter.Values.Name -ErrorAction SilentlyContinue;
            #Get-Variable -Name $ParameterList;
        }
    }
    
    test -asdf blah;
    

    Output

    The output from the command looks like this:

    Name                           Value                                           
    ----                           -----                                           
    Bar                            test                                            
    Baz                                                                            
    Asdf                           blah