Как я могу ввести конфигурационный файл в сценарии Powershell?

Предположим, что у меня есть Powershell script, называемый Foo.ps1

Я хотел бы представить файл конфигурации XML с именем Foo.ps1.config

где я могу указать настройки моей среды примерно так:

<FunctionsDirectory>
     $ScriptDirectory\Functions
</FunctionsDirectory>
<ModulesDirectory>
     $ScriptDirectory\Modules
</ModulesDirectory>

И тогда я хотел бы загрузить эту конфигурацию в начале Foo.ps1, чтобы я мог импортировать свои модули и точечные ноты в каталог Functions.

Как я могу достичь этого в Powershell?

Ответ 1

Возможно, это более простое решение.... Предполагая, что ваш файл конфигурации - это имена "Confix.xml", попробуйте следующее:

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

Чтение данных из вашей новой переменной:

PS Testing> $configFile.configuration.appsettings
#comment                             add
--------                             ---
Vars                                 {add, add}

PS Testing> $configFile.configuration.appsettings.add
key                                  value
---                                  -----
var1                                 variableValue1
var2                                 variableValue2

PS Testing> $configFile.configuration.appsettings.add[0].value
variableValue2

Короче говоря: перечислите переменную как XML и сделайте get-content.

В этом случае Config.xml выглядит следующим образом:

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

Ответ 2

На основе Keith solution... Код для загрузки 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]{
        }
    }

Чтобы заполнить переменные из значений XML:

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

И связанный с ним XML:

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

Ответ 3

Для альтернативы конфигурации XML, если вы гибки в использовании другого типа конфигурации. Я предлагаю использовать глобальный файл конфигурации PS, и вот как это делается:

Создайте файл конфигурации Powershell (например, Config.ps1), затем поместите всю конфигурацию в качестве глобальной переменной и запустите ее как первый шаг, чтобы значения конфигурации быть доступным в контексте script.

Преимущество этого подхода заключается в том, что в файле Config.ps1 PS можно использовать различные типы структуры данных, такие как скалярная переменная, коллекции и хеши, и легко ссылаются на код PS.. Ниже приведен пример:

enter image description here

Вот файл C:\Config\Config.ps1:

$global:config = @{   
    Var1 = "Value1"

    varCollection = @{       
        item0     = "colValue0"
        item1   = "colValue1"
        item2  = "colValue2"
    }       
}

Затем загрузите функции/переменные из файла Config.ps1 в этом модуле C:\Module\PSModule.psm1, например:

$scriptFiles = Get-ChildItem "$PSScriptRoot\Config\*.ps1" -Recurse

foreach ($script in $scriptFiles)
{
    try
    {       
        . $script.FullName 
    }
    catch [System.Exception]
    {
        throw
    }
}

Наконец, инициализация script содержит следующую строку: (C:\Init.ps1).

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

После запуска Init.ps1. global: config будет доступна в вашем контексте script. Вот результат:
enter image description here