2016-12-23 114 views
-4

我需要一些正則表達式幫助從日誌文件中解析出PowerShell對象。如何使用PowerShell解析此xml?

尋找使這些註釋屬性,PowerShell的對象:

ACVS_D = Date 
ACVS_TI = Info 
ACVS_C = Name 
ACVS_M = Message 

任何幫助將不勝感激!謝謝!

在.log文件的XML實例:

<ACVS_T> 
    <ACVS_D>12/23/2016 03:25:14.324</ACVS_D> 
    <ACVS_TI>db818c30-cdb9-4482-9b51-8f6aad8e914c,C?Cure Reports Server Component,svc-ccureMAS</ACVS_TI> 
    <ACVS_C>CrossFireWindowsService</ACVS_C> 
    <ACVS_S>SoftwareHouse.CrossFire.Server.Shared.CrossFireWindowsService.TraceMessage(String methodName, String message) 
</ACVS_S> 
    <ACVS_M> 
     CrossFireReportServer.ReconnectToServer() connected at 12/23/2016 3:25:14 AM 
    </ACVS_M> 
<ACVS_ST> 

    </ACVS_ST> 
</ACVS_T> 
<ACVS_T> 
    <ACVS_D>12/23/2016 03:25:14.324</ACVS_D> 
    <ACVS_TI>6af6dfab-c890-42c5-acd2-a9520e9742da,C?Cure Reports Server Component,svc-ccureMAS</ACVS_TI> 
    <ACVS_C>CrossFireWindowsService</ACVS_C> 
    <ACVS_S>SoftwareHouse.CrossFire.Server.Shared.CrossFireWindowsService.TraceMessage(String methodName, String message) 
</ACVS_S> 
    <ACVS_M> 
     CrossFireReportServer.ReconnectToServer() connected at 12/23/2016 3:25:14 AM 
    </ACVS_M> 
<ACVS_ST> 

    </ACVS_ST> 
</ACVS_T> 
+3

不要用正則表達式。 – ndn

+2

'Select-Xml -Path Log.xml -XPath'RootNodeHere/ACVS_T'| ForEach {$ _。Node ...}' – TessellatingHeckler

回答

0

我不會建議使用正則表達式,除非它是一個很大文件。 您需要像這樣的正則表達式搜索字符串(?<=<ACVS_T>)((.|\n)*)(?=<\/ACVS_T>) 請針對您需要的每個部分進行調整。

您可以添加根節點並將其解釋爲XML文件。 如下例:

$File = "PathToFile" 

$XML = [XML]("<Root>" + (Get-Content -Path $File) + "</Root>") 

$XML.Root.ACVS_T | ForEach-Object { 
    $Obj = '' | Select-Object -Property ACVS_D, ACVS_TI, ACVS_C, ACVS_S, ACVS_M, ACVS_ST 
    $Obj.ACVS_D = $_.ACVS_D 
    $Obj.ACVS_ST = $_.ACVS_ST 
    $Obj.ACVS_C = $_.ACVS_C 
    $Obj.ACVS_S = $_.ACVS_S 
    $Obj.ACVS_M = $_.ACVS_M 
    $Obj.ACVS_ST = $_.ACVS_ST 
    $Obj 
} 
+0

非常感謝! – user3839452

+0

你能接受這個答案嗎? –