Getting all Named Parameters from Powershell including empty and set ones

parameters, powershell

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:

- Dynamically retrieve the command's name, using `$PSCmdlet`

- Get a list of the parameter for the command, using `Get-Command`

- 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                                            

Problem

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; ```

Original source