You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell脚本求助:提取最新日志中目标字符串的时间戳

解决PowerShell提取日志中目标字符串对应时间戳的问题

先给你修正并完善脚本,同时解释关键步骤:

首先,原脚本里的$dir变量未定义,直接用你指定的日志路径即可。另外,日志是按空行分隔的条目块,每个块里的Server message行就是时间戳所在行,所以我们可以按块读取日志,找到包含目标字符串的最后一个块,再从中提取时间。

完整脚本如下:

# 定义日志目录
$logDir = "O:\xyz\0502251\logs"
# 获取最新的日志文件
$latestLog = Get-ChildItem -Path $logDir -Filter 'async_SPARKLE_ONITE_*.log' | 
             Sort-Object CreationDate -Descending | 
             Select-Object -First 1
# 目标匹配字符串
$targetString = "Successfulyl finished running psp_dba_maint_4"

if ($latestLog) {
    # 读取日志内容并按空行分割成条目块(兼容Windows/类Unix换行)
    $logBlocks = (Get-Content -Path $latestLog.FullName -Raw) -split '\r?\n\r?\n' | Where-Object { $_ -ne '' }
    # 找到包含目标字符串的最后一个块
    $targetBlock = $logBlocks | Where-Object { $_ -match $targetString } | Select-Object -Last 1

    if ($targetBlock) {
        # 从块中提取时间戳,匹配Server message行的时间部分
        if ($targetBlock -match 'Server message: (\d{4}-\d{2}-\d{2} (\d{2}:\d{2})):\d{2}:\d{3}') {
            # 提取小时:分钟部分
            $timeStamp = $matches[2]
            Write-Host "The overnight completed at: $timeStamp"
        }
    } else {
        Write-Host "目标字符串未找到"
    }
} else {
    Write-Host "未找到符合条件的日志文件"
}

关键步骤说明:

  • 按块读取日志:用Get-Content -Raw读取整个日志内容,再通过-split '\r?\n\r?\n'按空行分割成独立的条目块,确保每个块对应一条完整的日志记录。
  • 定位目标块:筛选出包含目标字符串的块,取最后一个(对应最新的完成记录)。
  • 提取时间戳:用正则表达式匹配Server message行里的时间格式,精准捕获小时:分钟部分,完全符合你期望的输出格式。

另外,原脚本里的Select-String仅能拿到目标字符串所在行,但时间在该块的上方,按块处理能避免日志中同一时间有多条记录导致的匹配错误。

内容的提问来源于stack exchange,提问作者Rocky Johanson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:30:57