将值从Context参数连接到Select-String输出的Line属性

时间:2019-07-14 15:43:02

标签: powershell select-string

我正在尝试从单个目录中的多个文件编译日志错误。错误消息包含在两行范围内。我想将两行连接到一个行/对象中,然后将所有错误导出到一个整齐的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以便进一步分析。

如果这个问题看起来微不足道,我想道歉。我一直在寻找资源以试图解决这个问题,但不幸的是未能做到。预先感谢!

1 个答案:

答案 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