Last active
January 25, 2021 08:09
-
-
Save Jaykul/c623c45d32329cadac9e7622937e1b76 to your computer and use it in GitHub Desktop.
Like PSBoundParameters, but including default values
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function Get-ParameterValue { | |
#.Synopsis | |
# Get the actual values of parameters which have manually set (non-null) 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). | |
#.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 -- DO NOT pass this (dot-source Get-ParameterValues instead) | |
$Invocation = $MyInvocation, | |
# The $PSBoundParameters for the caller -- DO NOT pass this (dot-source Get-ParameterValues instead) | |
$BoundParameters = $PSBoundParameters | |
) | |
if($MyInvocation.Line[($MyInvocation.OffsetInLine - 1)] -ne '.') { | |
throw "Get-ParameterValues must be dot-sourced, like this: . Get-ParameterValues" | |
} | |
if($PSBoundParameters.Count -gt 0) { | |
throw "You should not pass parameters to Get-ParameterValues, just dot-source it like this: . Get-ParameterValues" | |
} | |
$ParameterValues = @{} | |
foreach($parameter in $Invocation.MyCommand.Parameters.GetEnumerator()) { | |
# gm -in $parameter.Value | Out-Default | |
try { | |
$key = $parameter.Key | |
if($null -ne ($value = Get-Variable -Name $key -ValueOnly -ErrorAction Ignore )) { | |
if($value -ne ($null -as $parameter.Value.ParameterType)) { | |
$ParameterValues[$key] = $value | |
} | |
} | |
if($BoundParameters.ContainsKey($key)) { | |
$ParameterValues[$key] = $BoundParameters[$key] | |
} | |
} finally {} | |
} | |
return $ParameterValues | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment