搜索文件中的某些字符串,而不是两次循环内容

时间:2016-11-10 09:06:24

标签: powershell

我有一个日志文件列表,这些日志文件每天都在00:00:00创建,因此每天都会记录在一个单独的日志文件中。 4日志文件由于4种不同的原因每天都会被创建,我必须循环遍历它们并选择错误消息。

日志文件具有以下结构:

07.11.2016 12:00:41  Flag: Mandant=1, Modul=V, Pool=5
07.11.2016 12:00:41  Verarbeiten: M1, V, Pool 5, Dok 526198(), DokTyp 3, Skript BU-CO110.FF, Drucker 97
07.11.2016 12:00:41  fataler Fehler SalDocPoolItem_Process(5,): Err-226/VER-Dokument  nicht gefunden:           0

07.11.2016 12:00:57  Flag: Mandant=1, Modul=V, Pool=5
07.11.2016 12:00:57  Verarbeiten: M1, V, Pool 5, Dok 526198(), DokTyp 3, Skript BU-CO110.FF, Drucker 97
07.11.2016 12:00:57  fataler Fehler SalDocPoolItem_Process(5,): Err-226/VER-Dokument  nicht gefunden:           0

07.11.2016 12:01:13  Flag: Mandant=1, Modul=V, Pool=5
07.11.2016 12:01:13  Verarbeiten: M1, V, Pool 5, Dok 526198(), DokTyp 3, Skript BU-CO110.FF, Drucker 97
07.11.2016 12:01:13  fataler Fehler SalDocPoolItem_Process(5,): Err-226/VER-Dokument  nicht gefunden:           0

你可以看到一条消息" fataler fehler"在每个块的底部,所以我需要将整个块放到一个数组中,然后发送所有" fataler Fehler"所有日志文件的块一起放在一个简单的电子邮件中。

现在我基本上都有代码,但是这段代码要么有错误,要么需要超过10分钟才能执行,因为我在开始编写这个问题前5分钟运行它,但它仍然没有完成。

目标:拥有$FailArray变量

中的所有块

你能告诉我一个更好的方法来实现我的目标吗?我真的不喜欢两次使用get-content,因为我觉得没有必要,我确信这比我的解决方案更好:

# Prepare Array
$FailArray = @()

# Search for Log Files
$a = gci "C:\path" -filter *.log | ? { $_.LastWriteTime -ge (get-date).AddDays('-1') }

# Loop over Log Files
$a | % {
    # Are there errors in the log?
    $x = get-content $_.FullName | ? { $_ -like "*Fehler*" }
    # If there are errors in the block, get the "time stamp" of the Block, like 12:00:57
    if ($x) { $y = $x | % { $_.split(' ')[1] } } else { return }
    # Search the whole block, depending on the timestamp
    $z = get-content $_.FullName | ? { $_ -like "*$y*" }
    # Add found blocks to FailArray
    $FailArray += $z
}

更多: 有时,块的第一个消息的时间戳与其他时间戳不同1秒 - 是否有可能以某种方式获得整个块? (只是一个很好的,没有必要)

07.11.2016 12:00:24  Flag: Mandant=1, Modul=V, Pool=5
07.11.2016 12:00:25  Verarbeiten: M1, V, Pool 5, Dok 526198(), DokTyp 3, Skript BU-CO110.FF, Drucker 97
07.11.2016 12:00:25  fataler Fehler SalDocPoolItem_Process(5,): Err-226/VER-Dokument  nicht gefunden:      

1 个答案:

答案 0 :(得分:3)

您可以使用-context参数并选择匹配项上方的两行+实际匹配项:

$FailArray = gci "C:\path" -filter *.log | ? { $_.LastWriteTime -ge (get-date).AddDays('-1') } | % {
   Select-String -Path  $_ -Pattern 'fataler Fehler' -Context 2,0 | foreach {$_.Context.PreContext; $_.Line}
}