2017-03-02 12 views
0

我有一個文本文件,應用程序經常錯誤。我想用Powershell監視這個文件,並將每個錯誤記錄到另一個源文件中。如何使用powershell和正則表達式匹配多行文本

問題解決:當我們在等待時如何傳遞多行文本? Get-Content傳遞字符串數組。文字帆船是獲得降

$File = 'C:\Windows\Temp\test.txt' 

$content = Get-Content -Path $file 

# get stream of text 

Get-Content $file -wait -Tail 0 | ForEach-Object { 
    if ($_ -match '(<ACVS_T>)((.|\n)*)(<\/ACVS_T>)+'){ 
       write-host 'match found!' 
      } 
    } 

例子:

<ACVS_T> 
    <ACVS_D>03/01/2017 17:24:03.602</ACVS_D> 
    <ACVS_TI>bf37ba1c9,iSTAR Server Compone</ACVS_TI> 
    <ACVS_C>ClusterPort</ACVS_C> 
    <ACVS_S>SoftwareHouse.NextGen.HardwareInterface.Nantucket.Framework.ClusterPort.HandleErrorState() 
</ACVS_S> 
    <ACVS_M> 
     ERROR MESSAGE FROM APP 
    </ACVS_M> 
<ACVS_ST> 

    </ACVS_ST> 
</ACVS_T> 
+0

解決了我自己的問題 – user3839452

回答

0

解決它!

$File = 'D:\Program Files (x86)\Tyco\CrossFire\Logging\SystemTrace.Log' 

$content = Get-Content -Path $file 

# get stream of text 

$text = '' 
Get-Content $file -wait -Tail 0 | ForEach-Object { 
    $text +=$_ 
    if ($text -match '(<ACVS_T>)((.|\n)*)(<\/ACVS_T>)+'){ 
       [xml]$XML = "<Root>" + $text + "</Root>" 
       $text='' #clear it for next one 
       $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 
        write-host "`n`n$($Obj.ACVS_M)" 
       } 


      } 
    } 
相關問題