借助PowerShell词典更新web.config中的应用程序设置

mah*_*esh 2 powershell powershell-2.0

我正在尝试使用PowerShell更改web.config文件中的应用程序设置

以下是web.config文件;

<configuration>
    <connectionStrings>
        <add name="TestDBEntities" connectionString="metadata=res://*/TestProject.csdl|res://*/TestProject.ssdl|res://*/TestProject.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SQL01;initial catalog=TestDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
    </connectionStrings>
    <appSettings>
        <add key="ActivePeriod" value="false" />
        <add key="Environment" value="UAT" />
        <add key="authmode" value="4" />
        <add key="IsEncryptedConfig" value="true" />
        <add key="LogErrorsToText" value="true" />
    </appSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我想更改应用程序设置值。为此,我将所有相应的值存储在PowerShell字典中。这是我的字典。

Key                     Value
-----                   -----
ActivePeriod            true
Environment             prod
LogErrorsToText         false
Run Code Online (Sandbox Code Playgroud)

现在,我想将每个Dictionary键与appsetting键进行匹配。如果任何字典键与appsetting键匹配,则应替换相应的值。就我而言,我期望以下输出;

<configuration>
    <connectionStrings>
        <add name="TestDBEntities" connectionString="metadata=res://*/TestProject.csdl|res://*/TestProject.ssdl|res://*/TestProject.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SQL01;initial catalog=TestDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
    </connectionStrings>
    <appSettings>
        <add key="ActivePeriod" value="true" />
        <add key="Environment" value="prod" />
        <add key="authmode" value="4" />
        <add key="IsEncryptedConfig" value="true" />
        <add key="LogErrorsToText" value="false" />
    </appSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)

有人可以建议我可能的解决方案。提前致谢。

Mat*_*sen 7

遍历Keys字典中的,并<add />在Xml文档中找到相应的节点,然后设置属性(如果找到):

$xml = [xml](Get-Content .\app.config)

$Dictionary = @{
    ActivePeriod    = 'true'
    Environment     = 'prod'
    LogErrorsToText = 'false'
}

foreach($key in $Dictionary.Keys)
{
    Write-Host "Locating key: '$key' in XML"
    # Use XPath to find the appropriate node
    if(($addKey = $xml.SelectSingleNode("//appSettings/add[@key = '$key']")))
    {
        Write-Host "Found key: '$key' in XML, updating value to $($Dictionary[$key])"
        $addKey.SetAttribute('value',$Dictionary[$key])
    }
}
Run Code Online (Sandbox Code Playgroud)

  • `$xml.Save(".\app.config")` (9认同)