2017-03-02 4 views
0

私はアプリケーションが常にエラーになるテキストファイルを持っています。私はPowershellでこのファイルを監視し、すべてのエラーを別のソースに記録します。複数行でpowershellとregex matchを使ってテキストをストリームする方法

解決する問題:私たちが待っているときに複数行のテキストを渡すにはどうすればよいですか? 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)" 
       } 


      } 
    } 
関連する問題