How can I introduce a config file to Powershell scripts? How can I introduce a config file to Powershell scripts? xml xml

How can I introduce a config file to Powershell scripts?


Probably an easier solution....Assuming your configuration file is names "Confix.xml", try this:

PS Testing> [xml]$configFile= get-content .\Config=.xmlPS Testing> $configFilexml                                  configuration---                                  -------------version="1.0"                        configuration

Reading data out of your new variable:

PS Testing> $configFile.configuration.appsettings#comment                             add--------                             ---Vars                                 {add, add}PS Testing> $configFile.configuration.appsettings.addkey                                  value---                                  -----var1                                 variableValue1var2                                 variableValue2PS Testing> $configFile.configuration.appsettings.add[0].valuevariableValue2

Long story short: Cast your variable as XML, and do a get-content.

In this case, the Config.xml looks like this:

<?xml version="1.0"?><configuration>  <startup>  </startup>  <appSettings>    <!--Vars -->    <add key="var1" value="variableValue1"/>    <add key="var2" value="variableValue2"/>  </appSettings></configuration>


For an alternative to XML configuration, if you are flexible to use other type of configuration. I suggest using a global PS configuration file and here is how:

Create a Powershell configuration file ( E.g. Config.ps1 ), then put all configuration as global variable and init it as a first step so that configuration values should be available in your script context.

Benefit of this approach is that various type of data structure such as scalar variable, collections and hashes can be used in Config.ps1 PS file and referenced easily in the PS code.

the following is an example in action:

enter image description here

Here is the C:\Config\Config.ps1 file:

$global:config = @{       Var1 = "Value1"    varCollection = @{               item0     = "colValue0"        item1   = "colValue1"        item2  = "colValue2"    }       }

Then load the functions/variables from Config.ps1 file in this module C:\Module\PSModule.psm1, like so:

$scriptFiles = Get-ChildItem "$PSScriptRoot\Config\*.ps1" -Recurseforeach ($script in $scriptFiles){    try    {               . $script.FullName     }    catch [System.Exception]    {        throw    }}

Lastly, initialization script contains this one line below: ( C:\Init.ps1 ).

Import-Module $PSScriptRoot\Module\PSModule.psm1 -Force

After running the Init.ps1. global:config variable will be available in your script context. Here is the output:
enter image description here


Based on Keith's solution... Code to load XML:

   $configFile = "c:\Path2Config"    if(Test-Path $configFile) {        Try {            #Load config appsettings            $global:appSettings = @{}            $config = [xml](get-content $configFile)            foreach ($addNode in $config.configuration.appsettings.add) {                if ($addNode.Value.Contains(‘,’)) {                    # Array case                    $value = $addNode.Value.Split(‘,’)                        for ($i = 0; $i -lt $value.length; $i++) {                             $value[$i] = $value[$i].Trim()                         }                }                else {                    # Scalar case                    $value = $addNode.Value                }            $global:appSettings[$addNode.Key] = $value            }        }        Catch [system.exception]{        }    }

To populate variables from the XML values:

            $variable1 = $appSettings["var1"]            $variable2 = $appSettings["var2"]

And the associated XML:

<?xml version="1.0"?><configuration>  <startup>  </startup>  <appSettings><!--Vars -->    <add key="var1" value="variableValue1"/>    <add key="var2" value="variableValue2"/>  </appSettings></configuration>