首页 > 解决方案 > 如何从目录中读取所有 .log 文件

问题描述

我正在运行在目录 c:mydir 中生成 .log 文件的 .bat 脚本,我想读取所有 .log 文件以监视我的脚本。

.log 文件的内容非常基本,如果脚本运行以失败告终,在 .log 文件中我有一个字符串:'Finished with errors'(fileA.log 和 fileB.log)。如果运行成功:完成且没有错误(fileC.log)

目标是让 POWERSHELL 脚本返回文件名 + 状态:

标签: powershell

解决方案


这是一个基于单个管道的简洁的 PowerShell 惯用解决方案,它结合了Get-ChildItemForEach-ObjectSelect-String

Get-ChildItem *.log | ForEach-Object {
  [pscustomobject] @{
    Name = $_.Name
    Status =
      ('FAILED', 'SUCCESS')[(Select-String -Quiet 'Finished with NO errors' $_.FullName)]
  }
}

这会输出对象,即[pscustomobject]实例,每个日志文件一个,每个都有一个.Name和一个.Status属性;在控制台中,您应该会看到如下输出:

Name      Status
----      ------
fileA.log FAILED
fileB.log FAILED
fileC.log SUCCESS

性能优化:

如果您的日志文件很大mclayton明智地建议使用Get-Content -Tail 1( Get-Content -Last 1) 作为优化,假设成功标记字符串始终位于最后一行:

Get-ChildItem *.log | ForEach-Object {
  [pscustomobject] @{
    Name = $_.Name
    Status =
      ('FAILED', 'SUCCESS')[(Get-Content $_.FullName -Tail 1) -match 'Finished with NO errors']
  }
}

推荐阅读