首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PowerShell读取.log文件的最后两行

PowerShell读取.log文件的最后两行
EN

Stack Overflow用户
提问于 2021-01-08 18:08:00
回答 4查看 48关注 0票数 0

如何只读取.log文件的最后两行?以下脚本读取返回错误状态的完整.log文件。对于我的特殊情况,返回每个.log文件的正确状态的字符串写在最后两行。

代码语言:javascript
运行
复制
function Get-Status($file) {
    if (Select-String -Quiet 'Finished with errors' $_.FullName) {
        return "ERROR"
    } elseif (Select-String -Quiet 'Finished with warnings' $_.FullName) {
        return "WARNING"
    } elseif (Select-String -Quiet 'Finished.' $_.FullName) {
        return "SUCCESS"
    } else {
       return "FAILED"
    }
}

Get-ChildItem C:\logfolder\*.log | % {
    [PSCustomObject] @{
        Name = $_.Name;
        Date = $_.LastWriteTime;
        Status = Get-Status($_.FullName)]
    }
}
EN

回答 4

Stack Overflow用户

发布于 2021-01-08 18:31:46

您可以使用Get-Content和仅选择最后两行来读取文件内容,如下所示:

代码语言:javascript
运行
复制
$fileContent = Get-Content -Path $file -Tail 2

因此,将此代码添加到您的Get-Status函数应该会返回正确的状态:

代码语言:javascript
运行
复制
function Get-Status($file) {
    $fileContent = Get-Content -Path $file -Tail 2
    if (Select-String -Quiet -Pattern 'Finished with errors' -InputObject $fileContent) {
        return "ERROR"
    } elseif (Select-String -Quiet -Pattern 'Finished with warnings' -InputObject $fileContent) {
        return "WARNING"
    } elseif (Select-String -Quiet -Pattern 'Finished.' -InputObject $fileContent) {
        return "SUCCESS"
    } else {
       return "FAILED"
    }
}
票数 2
EN

Stack Overflow用户

发布于 2021-01-08 18:32:03

在最新版本的PowerShell Get-Content中支持-Tail参数,因此您可以将Get-Content转换为select字符串,例如,对于第一个if语句:

代码语言:javascript
运行
复制
Get-Content -Tail 2  $_.FullName | Select-String -Quiet 'Finished.'
票数 0
EN

Stack Overflow用户

发布于 2021-01-08 18:36:49

另一种变体是在Get-Status函数中使用switch

代码语言:javascript
运行
复制
function Get-Status([string]$file) {
    # get the last two lines of the log and recombine them with a newline
    switch -Regex ((Get-Content -Path $file -Tail 2) -join "`r`n") {
        '(?m)^Finished with error'   { 'ERROR'   ; break}
        '(?m)^Finished with warning' { 'WARNING' ; break}
        '(?m)^Finished'              { 'SUCCESS' ; break}
        default                      { 'FAILED'}
    }
}

Get-ChildItem -Path 'C:\logfolder' -Filter '*.log' -File | ForEach-Object {
    [PSCustomObject] @{
        Name = $_.Name
        Date = $_.LastWriteTime
        Status = Get-Status $_.FullName
    }
}

请注意,对于PowerShell,您应该在函数名和参数之间使用空格字符,而不是将此参数放在括号中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65627015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档