Powershell:如何使用 -Exclude 对另一个文件中的多行文本进行 Select-String 搜索

Powershell: How to do a Select-String search with an -Exclude for multiple lines of text in another file

项目: 我有一个正在不断添加的日志文件。在这个日志文件中,有时会添加一个错误(错误总是包含 "Unable to import" 和一个唯一的 ID)。当这个错误被添加到日志文件时,我需要通过电子邮件提醒我。

项目当前状态: 我有脚本(计划每 15 分钟 运行)使用 Select- 扫描日志文件字符串,如果发现此错误,它会将其添加到名为 alert-(Get-Date).txt 的单独文本文件中。在 PS 脚本的末尾,alert.txt 文件通过电子邮件发送给我。

问题: 每天都会创建一个新的日志文件,因此我的脚本只扫描该文件。问题是一旦发现错误,每次后续扫描都会向我发送一个我已经知道的错误警报。我希望后续警报仅包含新错误。

当前尝试解决问题 以下是日志文件中的示例错误:

 1/29/2015 13:38:45 1/29/2015 13:38:45  Sales Order User Import     Unable to import OHDR_2785_228038_01292015.txt due to required files missing. Files are being removed from current directory to suspense directory.

我在脚本中添加了提取日志文件中错误的唯一 ID 的方法。在本例中为 2785。此 ID 和其他错误 ID 被添加到另一个文本文件名 oldAlerts.txt。所以内容看起来像这样:

2785
1182
1353
1555

我想在我的脚本中添加一种方法来排除 Select-String 结果的这些行。到目前为止,这是我的 Select-String:

Get-ChildItem \txtforerp\Import\Log | Where{$_.LastWriteTime -gt (Get-Date)-$ts -AND $_.LastWriteTime -lt (Get-Date)} | select-string -Pattern "Unable to import" | Out-File $path\"$alert.txt" 

如何使用 oldAlert.txt 文件中的 ID 作为过滤器以确保仅将新错误添加到警报中。 如果我的方法不是最佳实践,我愿意使用其他方法。

我建议使用 negative assertion lookahead 排除任何已报告的行。此外,使用 Select-String 也应该很容易识别新 ID:

Get-ChildItem \txtforerp\Import\Log | Where{ $_.LastWriteTime -gt (Get-Date)-$ts } | 
    Select-String "Unable to import OHDR_(?!$($ids -join '|'))(\d{4})" | 
    Select-Object Filename, Line, { $_.Matches.Groups[1].Value }

在此代码中,$ids 表示先前识别的 ID 列表。 顺便说一句:我删除了这张支票:

$_.LastWriteTime -lt (Get-Date)

检查文件将来是否未被修改似乎不合理...?