借助 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="data source=SQL01;initial catalog=TestDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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="data source=SQL01;initial catalog=TestDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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 文件。
我正在尝试使用 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="data source=SQL01;initial catalog=TestDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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="data source=SQL01;initial catalog=TestDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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 文件。