function New-WebTierMachineConfigAppSettings { <# .SYNOPSIS Upserts Web Tier Machine Config App Settings. #> [CmdletBinding()] Param() $logLead = (Get-LogLeadName); [XML]$machineConfig = Read-MachineConfig [System.Xml.XmlElement]$configRoot = $machineConfig.configuration $machineConfigIsDirty = $false $appSettingsNode = $configRoot.SelectSingleNode("//appSettings") if ($null -eq $appSettingsNode) { Write-Verbose "$logLead : Creating appSettings Node" $appSettingsNode = $machineConfig.CreateElement("appSettings") $configRoot.AppendChild($appSettingsNode) | Out-Null } # Add App Settings foreach ($setting in $webTierAppSettings) { # Some settings are derived values which depend on other settings being instrumented. # We will change the value to REPLACEME here if the dependent values are not properly set so that they're skipped if ($setting.Name -eq "ReportServerUrl" -and ($webTierAppSettings | Where-Object {$_.Name -eq "ReportServer"}).Value -eq "REPLACEME") { $setting.Value = "REPLACEME" } elseif ($setting.Name -eq "ReportServerPath" -and $setting.Value -eq "/" -and [String]::IsNullOrEmpty([Environment]::GetEnvironmentVariable("POD", "Machine"))) { $setting.Value = "REPLACEME" } $appSetting = $appSettingsNode.SelectSingleNode(("//add[@key='{0}']" -f $setting.Name)) if ($null -eq $appSetting) { Write-Output ("$logLead : Adding {0} node with value {1}" -f $setting.Name, $setting.Value) $appSettingElement = $machineConfig.CreateElement("add") $appSettingElement.SetAttribute("key", $setting.Name) if ($setting.Value -eq "REPLACEME") { Write-Warning ("$logLead : Value read as REPLACEME. Node {0} will be added with an empty value" -f $setting.Name) $appSettingElement.SetAttribute("value", "") } else { $appSettingElement.SetAttribute("value", $setting.Value) } $appSettingsNode.AppendChild($appSettingElement) | Out-Null $machineConfigIsDirty = $true } elseif ($appSetting.Attributes["value"].Value -ne $setting.Value) { if ($setting.Value -ne "REPLACEME" -and $setting.Name -ne "ReportServerPath") { Write-Output ("$logLead : Update setting {0} value from {1} to {2}" -f $setting.Name, $appSetting.Attributes["value"].Value, $setting.Value) $appSetting.SetAttribute("value", $setting.Value) $machineConfigIsDirty = $true } elseif ($setting.Value -ne "REPLACEME" -and $setting.Name -eq "ReportServerPath") { Write-Warning ("$logLead : The ReportServerPath setting exists but does not follow convention. Please confirm the value is correct. Value in machine.config: {0}. Value in script: {1}" -f $appSetting.Attributes["value"].Value, $setting.Value) } else { Write-Warning ("$logLead : Value read as REPLACEME. Node {0} will not be updated" -f $setting.Name) } } else { Write-Verbose ("$logLead : AppSetting {0} already exists with correct value" -f $setting.Name) } } if ($machineConfigIsDirty) { Write-Output ("$logLead : Saving Modified machine.config") $machineConfig.Save($machineConfigPath) } else { Write-Output ("$logLead : No changes required to the machine.config") } } Set-Alias -name Create-WebTierMachineConfigAppSettings -value New-WebTierMachineConfigAppSettings;