Как я могу ввести конфигурационный файл в сценарии 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]()