如何在多行上使用powershell和regex匹配来流式传输文本

时间:2017-03-02 02:22:58

标签: regex 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!'
            }
    }

获取drop的文本邮箱示例:

<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>

1 个答案:

答案 0 :(得分: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)"
                }


            }
    }