Skip to content

Instantly share code, notes, and snippets.

@Jaykul
Last active January 25, 2021 08:09
Show Gist options
  • Save Jaykul/c623c45d32329cadac9e7622937e1b76 to your computer and use it in GitHub Desktop.
Save Jaykul/c623c45d32329cadac9e7622937e1b76 to your computer and use it in GitHub Desktop.
Like PSBoundParameters, but including default values
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