2011-12-15 29 views
2

我已經使用PowerShell從EventLog中導出數據,並創建了一個示例模式以將數據導入SQL,但是存在使用ConvertToXML從PowerShell導出數據的方式問題。在PowerShell中更改XML標籤並保留內容。

XML的導出如下所示;

<Property Name="Version">0</Property> 

<Property Name="Qualifiers" /> 

<Property Name="Level">0</Property> 

<Property Name="Task">14339</Property> 

<Property Name="Opcode">0</Property> 

<Property Name="Keywords">-9218868437227405312</Property> 

<Property Name="RecordId">57963203</Property> 

<Property Name="ProviderName">Microsoft-Windows-Security-Auditing</Property> 

但它應該是這個樣子;

<Version>0</Version> 

<Qualifiers> /> 

<Level>0</Level> 

<Task>14339</Task> 

下面的代碼標識屬性名稱和版本屬性標記 的起點和終點,並試圖將其改爲但不幸的是它改變了它不保持標籤中的內容。我似乎無法保持價值。

$EventLog = (Get-WinEvent -ComputerName xxxxxxx-FilterXML $Query) | ConvertTo-Xml -NoTypeInformation 

$EventLogModify = (Get-Content P:\EventTracking\Events.xml) | foreach{$_ -replace '(<Property Name=""Version"">(.*?)</Property>)', "<Version></Version>" };Set-Content P:\EventTracking\Events.xml $EventLogModify; 

回答

3

你的問題是

-replace '(<Property Name=""Version"">(.*?)</Property>)', "<Version></Version>" 

您用一個空標籤代替了完整的標籤。我猜你要使用的拍攝組在更換:

-replace '(<Property Name=""Version"">(.*?)</Property>)', '<Version>$2</Version>' 

而且你可能使用雙引號的正則表達式之前,因爲在那裏""。這可能不會匹配任何內容,因爲它現在會在一行中查找兩個雙引號。

另一件事,你可能要全部更換一次,所以也許用這個:

-replace '<Property Name="([^"]+)">([^<]+)</Property>', '<$1>$2</$1>' 

這不是真的不夠好,雖然:

PS> $xml -replace '<Property Name="([^"]+)">([^<]+)</Property>', '<$1>$2</$1>' 
<Version>0</Version> 
<Property Name="Qualifiers" /> 
<Level>0</Level> 
<Task>14339</Task> 
<Opcode>0</Opcode> 
<Keywords>-9218868437227405312</Keywords> 
<RecordId>57963203</RecordId> 
<ProviderName>Microsoft-Windows-Security-Auditing</ProviderName> 

正如你所看到的,Qualifiers仍沒有改變。所以另一個替換:

-replace '<Property Name="([^"]+)"\s*/>','<$1/>' 

看起來好多了

PS> $xml -replace '<Property Name="([^"]+)">([^<]+)</Property>', '<$1>$2</$1>' -replace '<Property Name="([^"]+)"\s*/>','<$1/>' 
<Version>0</Version> 
<Qualifiers/> 
<Level>0</Level> 
<Task>14339</Task> 
<Opcode>0</Opcode> 
<Keywords>-9218868437227405312</Keywords> 
<RecordId>57963203</RecordId> 
<ProviderName>Microsoft-Windows-Security-Auditing</ProviderName> 
+0

哇。這絕對是美麗的。這是我現在的代碼; $ EventLogModify =(Get-Content P:\ EventTracking \ Events.xml)| foreach {$ _ -replace'([^ <] +)','<$1> $ 2'-replace'','<$1/>'}; Set-Content P:\ EventTracking \ Events.xml $ EventLogModify; 非常感謝。 – 2011-12-15 10:11:47

0

另一種簡單的方法:

[Xml][email protected]' 
<root> 
<Property Name="Version">0</Property> 
<Property Name="Qualifiers" /> 
<Property Name="Level">0</Property> 
<Property Name="Task">14339</Property> 
<Property Name="Opcode">0</Property> 
<Property Name="Keywords">-9218868437227405312</Property> 
<Property Name="RecordId">57963203</Property> 
<Property Name="ProviderName">Microsoft-Windows-Security-Auditing</Property> 
</root> 
'@ 



$xml.SelectNodes('//Property') | ForEach ` 
-begin { 
     $h = New-Object xml 
     $r = $h.CreateElement("ROOT") 
     $null=$h.AppendChild($r) 
    } ` 
-process { 
    if($_.'#text') { 
     $n = $h.CreateElement($_.Name) 
     $n.InnerText = $_.'#text' 
     $null=$r.AppendChild($n) 
    } 
    else { 
     $n = $h.CreateElement($_.Name) 
     $null=$r.AppendChild($n) 
     } 
    } ` 
-End { 
     $h.OuterXml 
     } 

或:

$xml.SelectNodes('//Property')|% { 
if($_.'#text') { "<{0}>{1}</{0}>" -f $_.name,$_.'#text' } else {"<$($_.name)/>"} 
}