Powershell select-字符串匹配文件和输出文件名中的第一个实例

Powershell select-string match first instance in file and output filename

我有一些由 IMAPSync 进程生成的日志文件。每个邮箱都有一个已同步的日志文件。

我需要识别所有具有特定字符串的日志文件。

目前我有

Get-ChildItem -Filter *.txt | select-string 'Quota exceeded'

这会尽职尽责地打印出包含此字符串的所有行,这些行可能会在日志文件中多次出现。当脚本遇到第一个匹配项并转到下一个项目并仅打印文件名时,我想要的脚本 'stop'。

例如如果我有 3 个文件:

Fu.txt 



Bar.txt



Baz.txt

每行有 10,000 行,在 Bar.txt 中有 3,000 行有 'Quota Exceeded' - 我只想从脚本中输出:

Bar.txt

与目前相反,我有一个 shell window 充满了结果。

使用 switch-File 参数可能比 Select-String 更有效,例如,如果通配符模式 匹配一次然后继续下一个文件。

Get-ChildItem -Filter *.txt -PipelineVariable dir | ForEach-Object {
    switch -Wildcard -File ($_.FullName) {
        '*Quota exceeded*' { return $dir.FullName }
    }
}

Select-String 使用 -List 参数也可能是一个很好的可能性,但我倾向于上面的例子。

-List

每个输入文件仅返回匹配文本的第一个实例。这是检索内容与正则表达式匹配的文件列表的最有效方法。

(Select-String -Path *.txt -SimpleMatch -List -Pattern 'Quota exceeded').Path