我使用PowerShell来定制部署,我需要手动检查一个web.config是否存在一个特定的程序集bindingRedirect,如果没有,我需要添加它。
我发现了很多示例和材料,但是我很难检测绑定重定向是否存在,并且很难用嵌套的节点和属性创建实际元素。
web配置(相关部分):
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Linq" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>我试过:
$XML.SelectSingleNode("/configuration/runtime/assemblyBinding[@xmlns='urn:schemas-microsoft-com:asm.v1']/dependentAssembly/assemblyIdentity[@name='System.IO']")
$XML.configuration.runtime.assemblyBinding.dependentAssembly.SelectSingleNode("assemblyIdentity[@name='System.IO']")
Select-Xml -Xml $XML -XPath '//assemblyIdentity[@name="System.IO"]'上述任何操作都无法使元素在if语句中使用。
发布于 2020-11-06 11:17:26
经过几个小时的尝试和阅读,我发现查找的主要问题是不能用纯文本指定的名称空间,更糟糕的是忽略它。对于要作为子节点添加的新元素的生成,我首先尝试使用元素属性设置的创建方法等等,但我的意图并不成功,而且不太干净。因此,我最终认为我可以从字符串创建一个XML,并将其转换为一个节点,从而使代码更简单、更清晰。
这是我的发现:
[xml]$XML = Get-Content -Path $File -Raw
$ns = New-Object System.Xml.XmlNamespaceManager($XML.NameTable)
$ns.AddNamespace("d", $xml.configuration.runtime.assemblyBinding.NamespaceURI)
if (-not ($XML.SelectSingleNode("//d:assemblyIdentity[@name='Microsoft.Extensions.Logging.Abstractions']", $ns))) {
$loggingElement = [xml]@'
<dependentAssembly xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
</dependentAssembly>
'@
$XML.configuration.runtime.assemblyBinding.AppendChild($XML.ImportNode($loggingElement.dependentAssembly, $true))
}
$XML.Save($File)在读取了XML文件之后,我创建了一个命名空间,并在SelectSingleNode中使用它。一旦验证绑定重定向不存在,我就从string创建一个新的XML,并将其作为节点导入后作为子节点追加。
大多数相关链接用来找出迄今为止我最好的解决方案是什么:
Checking if content is in web.config
Powershell: XPath cannot select when element has "xmlns" tag?
https://mrlynchbi.wordpress.com/2014/04/02/powershell-and-xml-with-namespaces
https://learn.microsoft.com/en-us/dotnet/standard/data/xml/xpath-queries-and-namespaces
注意:这绝对不是管理绑定重定向的一种推荐的标准方法,但在我的示例中,我使用第三方应用程序,该应用程序以zip更新方式提供,通过部署自动化,我根据需要覆盖默认的web.config。
https://stackoverflow.com/questions/64713596
复制相似问题