更正跨越多行的日志文件格式

Correct log file format spanning multiple lines

我想创建一个脚本,允许我更正日志文件的格式,几个月来一直错误生成的日志文件格式如下

xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX
 / EQUIPEMENT / Arrivée:20xx-xx-xx
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX
 / ACCI / Arrivée:20xx-xx-xx
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX
 / CMS / Arrivée:20xx-xx-xx

我希望更正以下格式

xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX / EQUIPEMENT / Arrivée:20xx-xx-xx
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX / ACCI / Arrivée:20xx-xx-xx
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX / CMS / Arrivée:20xx-xx-xx

我正在尝试使用我已经创建的清晰日志脚本:

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
$ADRESSE = $scriptPath
$TEXT1 = ' / EQUIPEMENT*'
$TEXT2 = ' / ACCI*'
$TEXT3 = ' / CMS*'


$files = Get-ChildItem $ADRESSE -Filter LogSplitterProd_20200918_1740.log
foreach ($f in $files)
{
    $outfile = $f.FullName
    $GetLastWriteFile = Get-Item $outfile
    $LastWriteFile = $GetLastWriteFile.LastWriteTime
    If ((Get-Item $outfile).length -gt 2kb)
    {
        $data = foreach($line in Get-Content $outfile )
        {
            if($line -like $TEXT1 -Or $line -like $TEXT2 -Or $line -like $TEXT3) 
            {
                #$line=$line -replace ("`n`r","") #TEST1
                #$line=$line -replace ("``n``r","") #TEST2
                #$line=$line.replace("`n",", ").replace("`r",", ") #TEST3
                #$line=$line -replace("`n",", ") #TEST4
                #$line=$line -replace("`r",", ") #TEST4
                #$line=$line -replace("`n`r",", ") #TEST5
            }
            else
            {
                $line
            }
        }
        $data | Set-Content $outfile -Force
    }
    $GetLastWriteFile.LastWriteTime = $LastWriteFile
    Write-Host "Save et date $outfile terminé"
}
#start-sleep 5

假设您的日志文件始终采用您指定的格式,您可以一次读取源文件 2 行并将它们连接在一起:

function Repair-LogFile
{
    param( $Logfile )
    
    $lineCount = 2;

    # read 2 lines of log file into a buffer,
    # then join them together and output the result
    Get-Content -Path $Logfile -Encoding UTF8 | foreach-object `
        -Begin {
            $buffer = @();
        } `
        -Process {
            $buffer += $_;
            if( $buffer.Length -eq $lineCount )
            {
                Write-Output ($buffer -join "");
                $buffer = @();
            }
        } `
        -End {
            if( $buffer.Length -gt 0 )
            {
                Write-Output ($buffer -join "");
            }
        }

}

用法:

Repair-LogFile -Logfile "C:\src\so\log.txt" | Set-Content -Path "c:\src\so\log2.txt"

另一种方法是使用带有参数 RegexFileswitch :

$result = switch -Regex -File 'D:\Test\some.log' {
    '^\s\/'  { $line + $_ ; $line = '' }
    default  { $line = $_ }
} 

# output on screen
$result

#output to new log file
$result | Set-Content -Path 'D:\Test\new.log'

输出:

xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX / EQUIPEMENT / Arrivée:20xx-xx-xx
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX / ACCI / Arrivée:20xx-xx-xx
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX / CMS / Arrivée:20xx-xx-xx