function Get-ConfigurationDataPathValue { [CmdletBinding()] Param( [Parameter(Mandatory=$true)] [AllowNull()] $Value, [Parameter(Mandatory=$true)] [string] $Path ) if([string]::IsNullOrWhiteSpace($Path)){ throw "Configuration data reference path must not be empty." } $Current = $Value $Segments = @($Path -split '\.') foreach($Segment in $Segments){ if([string]::IsNullOrWhiteSpace($Segment)){ throw "Configuration data reference path [$Path] contains an empty segment." } if($null -eq $Current){ throw "Configuration data reference path [$Path] was not found. Segment [$Segment] resolved from a null value." } if($Current -is [System.Collections.IDictionary]){ if(-not $Current.Contains($Segment)){ throw "Configuration data reference path [$Path] was not found. Segment [$Segment] is missing." } $Current = $Current[$Segment] continue } if($Current -is [System.Array] -and $Current -isnot [string]){ $Index = 0 if(-not [int]::TryParse($Segment, [ref]$Index)){ throw "Configuration data reference path [$Path] expected a numeric array index at segment [$Segment]." } if($Index -lt 0 -or $Index -ge @($Current).Count){ throw "Configuration data reference path [$Path] array index [$Index] is out of range." } $Current = @($Current)[$Index] continue } $Property = $Current.PSObject.Properties[$Segment] if($null -eq $Property){ throw "Configuration data reference path [$Path] was not found. Property [$Segment] is missing." } $Current = $Property.Value } return $Current }