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

如何使用PowerShell读取日志文件提取错误信息并导出为CSV文件

PowerShell提取DISM错误日志导出CSV方案

原有代码问题

  • 日志条目跨多行存储,逐行读取无法关联时间戳、错误码、错误信息三个字段
  • 正则使用^锚定行首,但hr:格式的错误码不在行首,导致匹配失效
  • 无结构化输出逻辑,无法直接生成符合要求的CSV文件

调整后完整代码

# 路径配置,改用Join-Path避免不同系统路径分隔符兼容问题
$PathLogFile = Join-Path -Path $PathFiles -ChildPath $FileLog
$PathErrorFile = Join-Path -Path $PathFiles -ChildPath $FileError

# 读取完整日志内容,按空行拆分为单条日志块
$allLogBlocks = (Get-Content -Path $PathLogFile -Raw) -split "`r?`n`r?`n" | Where-Object { $_.Trim() -ne '' }

$errorLogList = foreach ($block in $allLogBlocks) {
    # 跳过非错误类日志
    if ($block -notmatch ',\s*Error\s+DISM') {
        continue
    }
    # 提取错误时间戳
    $timeStamp = if ($block -match '^(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})') { $matches[1] } else { '无匹配时间' }
    # 提取错误码
    $errorCode = if ($block -match 'hr:(0x[0-9a-fA-F]{8})') { $matches[1] } else { '无匹配错误码' }
    # 提取错误描述信息
    $errorMsg = if ($block -match 'Failed\s+[^\r\n]+') { $matches[0].Trim() } else { '无匹配错误信息' }

    # 构造结构化输出对象
    [PSCustomObject]@{
        错误时间 = $timeStamp
        错误码 = $errorCode
        错误信息 = $errorMsg
    }
}

# 导出结果到CSV文件
$errorLogList | Export-Csv -Path $PathErrorFile -Encoding UTF8 -NoTypeInformation

关键优化点

  • 采用整读+按空行拆分日志块的逻辑,完美适配DISM跨多行的日志格式,确保同一个错误的所有字段可以关联提取
  • 修正错误码正则规则,去掉无效的行首锚定,匹配hr:后固定8位十六进制字符,兼容大小写场景
  • 结构化输出对象直接导出CSV,自动处理特殊字符转义,生成的CSV可以直接用Excel打开

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 20:27:00