Private/Utils/Get-ParameterValues.ps1
function Get-ParameterValues { <# .Synopsis Get the actual values of parameters which have manually set default values or values passed in the call .Description Unlike $PSBoundParameters, the hashtable returned from Get-ParameterValues includes non-empty default parameter values. NOTE: Default values that are the same as the implied values are ignored (e.g.: empty strings, zero numbers, nulls). .Link https://gist.github.com/Jaykul/72f30dce2cca55e8cd73e97670db0b09/ .Link https://gist.github.com/elovelan/d697882b99d24f1b637c7e7a97f721f2/ .Example function Test-Parameters { [CmdletBinding()] param( $Name = $Env:UserName, $Age ) $Parameters = Get-ParameterValues # This WILL ALWAYS have a value... Write-Host $Parameters["Name"] # But this will NOT always have a value... Write-Host $PSBoundParameters["Name"] } #> [CmdletBinding()] param() # The $MyInvocation for the caller $Invocation = Get-Variable -Scope 1 -Name MyInvocation -ValueOnly # The $PSBoundParameters for the caller $BoundParameters = Get-Variable -Scope 1 -Name PSBoundParameters -ValueOnly $ParameterValues = @{} foreach ($parameter in $Invocation.MyCommand.Parameters.GetEnumerator()) { try { $key = $parameter.Key $value = Get-Variable -Name $key -ValueOnly -ErrorAction Ignore if ($BoundParameters.ContainsKey($key)) { $ParameterValues[$key] = $BoundParameters[$key] } else { $ParameterValues[$key] = $value } <# $key = $parameter.Key if ($null -ne ($value = Get-Variable -Name $key -ValueOnly -ErrorAction Ignore)) { if (($value -ne ($null -as $parameter.Value.ParameterType)) -or $parameter.Value.ParameterType -eq [System.Boolean]) { $ParameterValues[$key] = $value } } if ($BoundParameters.ContainsKey($key)) { $ParameterValues[$key] = $BoundParameters[$key] } #> } finally {} } $ParameterValues } |