ScriptsToProcess/Resolve-NodeProperty.ps1
function Global:Resolve-NodeProperty { [OutputType([System.Array])] [CmdletBinding()] param ( [Parameter(Mandatory = $true, Position = 0)] [string] $PropertyPath, [Parameter(Position = 1)] [AllowNull()] [object] $DefaultValue, [Parameter(Position = 3)] $Node = $ExecutionContext.InvokeCommand.InvokeScript('$Node'), [Parameter()] [Alias('DatumStructure')] [object] $DatumTree = $ExecutionContext.InvokeCommand.InvokeScript('$ConfigurationData.Datum'), [Parameter()] [string[]] $SearchPaths, [Parameter(Position = 5)] [AllowNull()] [int] $MaxDepth ) if ($Node -is [string] -and ($ConfigData = $ExecutionContext.InvokeCommand.InvokeScript('$ConfigurationData'))) { $Node = $ConfigData.AllNodes.Where{ $_.Name -eq $Node -or $_.NodeName -eq $Node } } # Null result should return an exception, unless defined as Default value $nullAllowed = $false $ResolveDatumParams = ([hashtable]$PSBoundParameters).Clone() foreach ($removeKey in $PSBoundParameters.Keys.Where{ $_ -in @('DefaultValue', 'Node') }) { $ResolveDatumParams.Remove($removeKey) } # Translate the DSC specific Node into the 'Node' variable and Node name used by Resolve-Datum if ($Node) { $ResolveDatumParams.Add('Variable', $Node) $ResolveDatumParams.Add('VariableName', 'Node') } # Starting DSC Behaviour: Resolve-Datum || $DefaultValue || $null if specified as default || throw if (($result = Resolve-Datum @ResolveDatumParams) -ne $null) { Write-Verbose "`tResult found for $PropertyPath" } elseif ($DefaultValue) { $result = $DefaultValue Write-Debug "`t`tDefault Found" } elseif ($PSBoundParameters.ContainsKey('DefaultValue') -and $null -eq $DefaultValue) { $result = $null $nullAllowed = $true Write-Debug "`t`tDefault NULL found and allowed." } else { #This is when the Lookup is initiated from a Composite Resource, for itself if (-not ($here = $PSScriptRoot)) { $here = $PWD.Path } Write-Debug "`t`tAttempting to load datum from $($here)." $resourceConfigDataPath = Join-Path -Path $here -ChildPath 'ConfigData' -Resolve -ErrorAction SilentlyContinue if ($resourceConfigDataPath) { $datumDefinitionFile = Join-Path -Path $resourceConfigDataPath -ChildPath 'Datum.*' -Resolve -ErrorAction SilentlyContinue if ($datumDefinitionFile) { Write-Debug "Resource Datum File Path: $datumDefinitionFile" $resourceDatum = New-DatumStructure -DefinitionFile $datumDefinitionFile } else { #Loading Default Datum structure Write-Debug "Loading data store from $($resourceConfigDataPath)." $resourceDatum = New-DatumStructure -DatumHierarchyDefinition @{ Path = $resourceConfigDataPath } } $resolveDatumParams.Remove('DatumTree') $result = Resolve-Datum @resolveDatumParams -DatumTree $resourceDatum } else { Write-Warning "`tNo Datum store found for DSC Resource" } } if ($null -ne $result -or $nullAllowed) { ,$result } else { throw "The lookup of path '$PropertyPath' for node '$($Node.Name)' returned a Null value, but Null is not specified as Default. This is not allowed." } } Set-Alias -Name Lookup -Value Resolve-NodeProperty -Scope Global Set-Alias -Name Resolve-DscProperty -Value Resolve-NodeProperty -Scope Global |