.net 如何将配置文件引入Powershell脚本?

.net 如何将配置文件引入Powershell脚本?,.net,xml,powershell,configuration,app-config,.net,Xml,Powershell,Configuration,App Config,假设我有一个名为Foo.ps1的Powershell脚本 我想介绍一个名为Foo.ps1.config的XML配置文件 我可以在其中指定环境设置,例如: <FunctionsDirectory> $ScriptDirectory\Functions </FunctionsDirectory> <ModulesDirectory> $ScriptDirectory\Modules </ModulesDirectory> $Sc

假设我有一个名为Foo.ps1的Powershell脚本

我想介绍一个名为Foo.ps1.config的XML配置文件

我可以在其中指定环境设置,例如:

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

$ScriptDirectory\Functions
$ScriptDirectory\Modules
然后我想在Foo.ps1的开头加载这个配置,这样我就可以将我的模块和dot notate导入到Functions目录中

如何在Powershell中实现这一点?

基于。。。加载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>

可能是一个更简单的解决方案。。。。 假设您的配置文件名为“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,并执行一个获取内容的操作

在本例中,Config.xml如下所示:

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

了解XML配置的替代方案,前提是您可以灵活地使用其他类型的配置。我建议使用全局PS配置文件,下面是如何创建Powershell配置文件(例如Config.ps1),然后将所有配置作为全局变量并初始化它作为第一步,以便配置值在脚本上下文中可用

这种方法的好处是,各种类型的数据结构(如标量变量、集合和散列)可以在Config.ps1 PS文件中使用,并且在PS代码中很容易引用

以下是一个实例:

以下是C:\Config\Config.ps1文件:

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

    varCollection = @{       
        item0     = "colValue0"
        item1   = "colValue1"
        item2  = "colValue2"
    }       
}
然后从模块C:\module\PSModule.psm1中的Config.ps1文件加载函数/变量,如下所示:

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

foreach ($script in $scriptFiles)
{
    try
    {       
        . $script.FullName 
    }
    catch [System.Exception]
    {
        throw
    }
}
. $PSScriptRoot\config.ps1
最后,初始化脚本包含以下一行:(C:\Init.ps1)

导入模块$PSScriptRoot\Module\PSModule.psm1-Force

在运行Init.ps1之后。全局:配置变量将在脚本上下文中可用。以下是输出:

另一个解决方案(类似于@yantq)就是使用一个单独的脚本并加载它

因此
config.ps1
包含:

$Environment = $Environment.ToUpper()
$GDriveUNC = "\\servername.domain.net\Data"
$BinLocation = "$pwd\bin-$Environment"
请注意,在本例中,
$Environment
是主脚本的一个参数,您可以执行任何需要的操作

然后在主脚本中,只需运行此“配置”脚本,如下所示:

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

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

我在网上找到了这个,对我来说很合理:或者这个:我以前用过Keith的解决方案,效果不错。我认为这是一个简单的解决方案和设置