Functions/Get-GlobalDefaultsFromJsonFiles.ps1
function Get-GlobalDefaultsFromJsonFiles { <# .Synopsis Get global defaults to use with $PSDefaultParameterValues .DESCRIPTION Returns a DefaultParameterDictionary to load into $PSDefaultParameterValues The Defaults will be loaded according to priority: - User settings from a file named as UserLogonID in caller location or current location(?) is loaded as Prio 1 - LogonDomain (or machine name) file in Module location is Prio 2 - Module name(s) settings is last in order. .PARAMETER CallerInvocation The invocation object from the caller. .Notes For information about PSDefaultParameterValues check these articles: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_parameters_default_values?view=powershell-6 https://www.red-gate.com/simple-talk/sysadmin/powershell/powershell-time-saver-automatic-defaults/ #> Param( [parameter(Position=0,mandatory=$true)] $CallerInvocation ) $result = New-Object System.Management.Automation.DefaultParameterDictionary foreach($settingsFile in (Get-SettingsFiles $CallerInvocation ".json")) { if (Test-Path "$settingsFile") { Write-Verbose "Get-GlobalDefaultValues:[$settingsFile]" $DefaultParamters = Get-Content -Path $settingsFile -Encoding UTF8 | ConvertFrom-Json | Set-ValuesFromExpressions ForEach($property in $DefaultParamters.psobject.properties.name) { if ($property.IndexOf(':') -ge 0) { $Variable = $property.Split(':')[1] #We do not load default values if it exists among the BoundParameters if (!$result.ContainsKey($property) -and -not $CallerInvocation.BoundParameters[$Variable].IsPresent) { try { $result.Add($property,$DefaultParamters.($property)) } catch { $ex = $PSItem $ex.ErrorDetails = "Err adding $property from $settingsFile. " + $PSItem.Exception.Message throw $ex } } } } } else { Write-Verbose "Get-GlobalDefaultValues:[$settingsFile] missing" } } #Return Parameter Dictionary [System.Management.Automation.DefaultParameterDictionary]$result } |