我正在尝试从单个目录中的多个文件编译日志错误。错误消息包含在两行范围内。我想将两行连接到一个行/对象中,然后将所有错误导出到一个整齐的csv中。
我正在尝试使用Select-String实用程序和-Context参数来完成此操作。在通过Select-Object实用程序传递结果之前,所有内容都是犹太洁食。但是,一旦通过Select-Object或Export-CSV通过管道传输结果,-Context行就会丢失。
$trigger = 'ERROR'
$folderPath = 'C:\Users\test\Desktop\testpath'
$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
省略选择对象和Export-Csv Cmdlet会产生所需的原始结果,并带有友好的直角括号'>'(ASCII 62)。原始结果甚至可以通过Out-File Cmdlet导出,没问题。
但是,我想做的是将Pattern行与Context行结合在一起,创建一个对象,最终将其输出为csv以便进一步分析。
如果这个问题看起来微不足道,我想道歉。我一直在寻找资源以试图解决这个问题,但不幸的是未能做到。预先感谢!
答案 0 :(得分:0)
通过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