我在配置文件中注释了两个会话状态节点。如何使用Powershell仅取消注释第一个会话状态节点?
<configuration>
<system.web>
<!--<sessionState allowCustomSqlDatabase="true" mode="SQLServer" sqlCommandTimeout="150" sqlConnectionString="SessionConnectionString"></sessionState>-->
<!--sessionState mode="InProc" timeout="500"></sessionState-->
</system.web>
</configuration>
答案 0 :(得分:0)
您可以使用正则表达式
(gc settings.xml -Raw) -replace "<!--(.+?)-->",'$1'
在某些边缘情况下,这可能会出现问题,在这种情况下,您可以通过以下代码获取XML注释:
([xml](gc settings.xml)).configuration.'system.web'.'#comment'
然后你可以AppendChild()
从注释字符串构建xml节点。
答案 1 :(得分:0)
简单方法:使用正则表达式进行文本操作。在要取消注释的行中查找唯一的内容。例如:
#Get-Content is in ( ) to read the whole file first so we don't get file in use-error when writing to it later
(Get-Content -Path web.config) -replace '<!--(<sessionState allowCustomSqlDatabase.+?)-->', '$1' | Set-Content -Path web.config
艰难的方式:Xml操作。我已经在这里发表了第一条评论,但如果情况更好,您可以像上面一样轻松搜索特定节点:
$fullpath = Resolve-Path .\config.xml | % { $_.Path }
$xml = [xml](Get-Content $fullpath)
#Find first comment
$commentnode = $xml.configuration.'system.web'.ChildNodes | Where-Object { $_.NodeType -eq 'Comment' } | Select-Object -First 1
#Create xmlreader for comment-xml
$commentReader = [System.Xml.XmlReader]::Create((New-Object System.IO.StringReader $commentnode.Value))
#Create node from comment
$newnode = $xml.ReadNode($commentReader)
#Replace comment with xmlnode
$xml.configuration.'system.web'.ReplaceChild($newnode, $commentnode) | Out-Null
#Close xmlreader
$commentReader.Close()
#Save xml
$xml.Save($fullpath)