function Invoke-ConfigurationDataExpression { [CmdletBinding()] Param( [Parameter(Mandatory=$true)] [string] $Expression, [Parameter(Mandatory=$true)] $Context ) $Expression = $Expression.Trim() if($Expression -match "^'(.*)'$"){ return $Matches[1] } if($Expression -match "^-?\d+$"){ return [int]$Expression } if($Expression -match "^(?i:true|false)$"){ return [bool]::Parse($Expression) } if(-not (Test-ConfigurationDataExpressionParentheses -Expression $Expression)){ throw "Invalid configuration data expression [$Expression]." } if($Expression -notmatch "^([A-Za-z][A-Za-z0-9]*)\((.*)\)$"){ throw "Invalid configuration data expression [$Expression]." } $FunctionName = $Matches[1] $ArgumentText = $Matches[2] if($FunctionName -ieq "coalesce"){ $RawArguments = @(Split-ConfigurationDataExpressionArguments -ArgumentText $ArgumentText) Assert-ConfigurationDataExpressionMinimumArgumentCount -Name $FunctionName -Arguments $RawArguments -Count 1 foreach($Argument in $RawArguments){ try { $Value = Invoke-ConfigurationDataExpressionArgument -Argument $Argument -Context $Context if(-not (Test-ConfigurationDataValueIsEmpty -Value $Value)){ return $Value } } catch { if(Test-ConfigurationDataMissingReferenceError -ErrorRecord $_){ continue } throw } } return $null } $Arguments = @() foreach($Argument in @(Split-ConfigurationDataExpressionArguments -ArgumentText $ArgumentText)){ $Arguments += ,(Invoke-ConfigurationDataExpressionArgument -Argument $Argument -Context $Context) } return Invoke-ConfigurationDataExpressionFunction -Name $FunctionName -Arguments $Arguments -Context $Context }