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

Update app settings in web.config with the help of PowerShell dictionary

我正在尝试使用 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>

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

Key                     Value
-----                   -----
ActivePeriod            true
Environment             prod
LogErrorsToText         false

现在,我想将每个字典键与应用程序设置键相匹配。如果任何字典键与 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>

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

遍历字典中的Keys,在Xml文档中找到对应的<add />节点,找到则设置属性:

$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])
    }
}

Mathias R. Jenssen 的答案很好地概述了如何做事,但正如 OP 在 his/her 答案的评论中提到的那样,它不是开箱即用的(对于至少更高版本的 PowerShell,我在 PS 5.1).

上测试过

对我有用的:

$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])
    }
}

$xml.Save('.\app.config')

请注意,不同之处在于 Hash Table 声明的分栏。我根据 official Microsoft documentation.

进行了此更改

此外,根据 OP 在评论中的要求,最后一行显示了如何保存 xml 文件。