2016-04-20 75 views
0

我有兩個會話狀態節點在配置文件中註釋掉。如何僅使用Powershell取消註釋第一個會話狀態節點?使用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節點。

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 

Demo @ Regex101

硬的方式: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) 
+0

使用XML操作方法,會引發'找不到構造函數錯誤。找不到類型System.IO.StringReader的適當構造函數' - 我嘗試了很多方法來取消這個節點的註釋,但是它們在第一個障礙似乎都失敗了......將註釋行識別爲節點 –

+0

這可能是因爲你的' $ commentnode.value'爲null(你沒有找到與你的where語句匹配的註釋節點)。爲什麼不使用文本替換?通常你知道(有一個唯一的標識符)你想修改的節點。我在回答之前用樣本輸入測試了兩種方法。 –

相關問題