繁体   English   中英

如何在多行上使用Powershell和正则表达式匹配流文本

[英]How to stream text with powershell and regex match on multiline

我有一个文本文件,应用程序经常出错。 我想使用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>

解决了!

$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)"
                }


            }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM