我正在尝试从单个目录中的多个文件编译日志错误。错误消息包含在两行的跨度内。我想将两行连接成一行/对象,然后将所有错误导出为整洁的csv。
我正在尝试使用选择字符串实用程序和 -Context 参数来实现这一点。在通过 Select-Object 实用程序管道传输结果之前,一切都是犹太洁食。但是,一旦我通过选择对象或导出 CSV 管道传输结果,-上下文行就会丢失。
$trigger = 'ERROR'
$folderPath = 'C:UserstestDesktoptestpath'
$logFiles = gci -Path $folderPath -Filter *.txt -File
$logFiles | Select-String -Pattern $trigger -CaseSensitive -SimpleMatch -Context 0,1 | Select-Object LineNumber, Line, Filename |
Export-Csv -Path .$(Get-Date -Format yyyymmddhhmmss).csv -Encoding UTF8 -NoTypeInformation
省略选择对象和导出 csv cmdlet 将生成所需的原始结果,其中包含友好的右尖括号">"(ASCII 62)。原始结果甚至可以通过输出文件 Cmdlet 导出,没问题。
但是,我想做的是将模式线与上下文线相结合,创建一个对象,最终将输出为 csv 以供进一步分析。
如果这个问题看起来微不足道,我想道歉。我已经搜索了资源试图解决这个问题,不幸的是无法做到。提前感谢!
通过 fl * 管道选择字符串以查看属性是什么。
$a = ls log | select-string error -context 0,1
$a | fl *
IgnoreCase : True
LineNumber : 2
Line : error
Filename : log
Path : /Users/js/log
Pattern : error
Context : Microsoft.PowerShell.Commands.MatchInfoContext
Matches : {0}
$a.context
PreContext PostContext DisplayPreContext DisplayPostContext
---------- ----------- ----------------- ------------------
{} {after } {} {after }
这对我有用:
ls log | select-string error -context 0,1 | select linenumber, line,
@{n='PostContext'; e={$_.context.postcontext}}, filename
LineNumber Line PostContext Filename
---------- ---- ----------- --------
2 error after log