Experience Sitecore ! | Configuring role and localenv variables in Sitecore 9 - PowerShell way

# Experience Sitecore !

### More than 200 articles about the best DXP by Martin Miles

In Sitecore 9, one can set up an instance into a specific 'role' that also takes predefined configurations. Further ahead, you may keep your numerous custom configurations next to each other targeting different 'roles' - that avoids clumsy config pathing and keeps settings functionally together in order to simplify maintenance. There is also 'localenv' setting that helps you to distinguish various groups of servers from the same role, but residing in the different environments. Not a nice way of changing role and adding environment by simply replacing a string occurrence:
(Get-Content Web.config).replace('    <add key="role:define" value="Standalone" />', '<add key="role:define" value="ContentManagement" /><add key="localenv:define" value="UAT" />') | Set-Content Web.config


Just a string replacement? Errrghh.... Not a nice solution! Let's make it better, by relying on XML namespace (thanks, Neil):
#$webConfigPath = "С:\path\to\your\Web.config" #$localEnvName = "UAT"

$RptKeyFound=0;$xml = (get-content $webConfigPath) -as [Xml]; # Create the XML Object and open the web.config file$root = $xml.get_DocumentElement(); # Get the root element of the file foreach($item in $root.appSettings.add) # loop through the child items in appsettings { if($item.key -eq "localenv:define")                       # If the desired element already exists
{
$RptKeyFound=1; # Set the found flag } } if($RptKeyFound -eq 0)                                      # If the desired element does not exist
{
$newEl=$xml.CreateElement("add");                       # Create a new Element
$nameAtt1=$xml.CreateAttribute("key");                  # Create a new attribute "key"
$nameAtt1.psbase.value="localenv:define"; # Set the value of "key" attribute$newEl.SetAttributeNode($nameAtt1); # Attach the "key" attribute$nameAtt2=$xml.CreateAttribute("value"); # Create "value" attribute$nameAtt2.psbase.value="$localEnvName"; # Set the value of "value" attribute$newEl.SetAttributeNode($nameAtt2); # Attach the "value" attribute$xml.configuration["appSettings"].AppendChild($newEl); # Add the newly created element to the right position }$xml.Save(\$webConfigPath)                                   # Save the web.config file

This same approach can be taken for any other XML-based transforms and replacements.