在PowerShell中使用多行正则表达式循环遍历多个文本文件

时间:2017-11-03 07:54:11

标签: powershell powershell-v4.0

我正在尝试使用正则表达式搜索几个文本文件。当正则表达式匹配单行时,我设法让它工作,但是当我使用匹配一行和另一行结束的正则表达式进行测试时,它不起作用。

我读过你首先需要将整个文件读取到变量/数组然后进行正则表达式搜索。我没有设法让它发挥作用。

文件夹和文件的结构是

Root Folder
├─17-11-01
│ ├─trace-0.log
│ └─trace-1.log
└─17-11-02
  ├─trace-0.log
  └─trace-1.log

我已设法获得文件的完整路径,但我不确定如何阅读文件的内容。我找到了[IO.File]::ReadAllText($Path),但我不确定如何将其添加到下面的命令中。

Get-ChildItem $Path -Filter $Filter -Recurse |
    Select FullName |
    ft -HideTableHeaders

总结我正在做的事情。

  • 进行正则表达式搜索,匹配的文本将跨越多行。
  • 同一根目录下多个路径中的多个文件。
  • 统计每个正则表达式匹配。

我目前在Windows 7上使用PowerShell v2,但我可以升级到v4。该脚本主要用于Windows 10和Windows Server 2012 R2及更高版本。

修改1 以下是日志文件和正则表达式的示例。

FINER: Entering service: ABC  
2017-11-03T08:22:18.557+0100 - INFO: Some info.
2017-11-03T08:22:18.557+0100 - INFO: Some info.
2017-11-03T08:22:18.557+0100 - INFO: Some info.
2017-11-03T08:22:18.557+0100 - INFO: Some info.
2017-11-03T08:22:18.557+0100 - INFO: Some info.
2017-11-03T08:22:18.557+0100 - INFO: Some info.
2017-11-03T08:22:18.557+0100 - INFO: The request has been completed.
(2017-10-.*FINER\: Entering service: (ABC |ABC1|ABC2))[\s\S]*?(INFO: \d\d\d\d\d\d\d\d\d\d\d\d The request has been completed)

1 个答案:

答案 0 :(得分:1)

编辑2解决方案

这是最终的代码。我的示例中的正则表达式与示例日志不匹配。

$Files = (Get-ChildItem $Path -Filter $FilterFile -Recurse | Get-Content | Out-String)

(Select-String -inputObject $Files -pattern $Regex -AllMatches).Matches.Count

表达式很好,这不是问题。

谢谢!