输出 Select-String 上下文所有行值

Output Select-String Context all Line Values

我正在做 Select-String 在一堆 .dco 中找到一个模式 并使用这一行我得到:

PS C:\> gci $folder -filter *.dco -Recurse | Select-String -Pattern $pattern 

C:\path\path_DCO17 December\DCO_CYC15_E_15122017.DCO:373:MTR150000010010          0  0RA              409347    0100000125000001250000140000NN  NNE 000

模式匹配,我得到了那一行。不过,包含我需要的实际数据的那一行在它下面,所以我添加了参数 -Context

PS C:\> gci $folder -filter *.dco -Recurse | Select-String -Pattern $pattern -Context 1

  C:\path\path_DCO17 December\DCO_CYC15_E_15122017.DCO:372:CUS150000010010001288502                                     
> C:\path\path_DCO17 December\DCO_CYC15_E_15122017.DCO:373:MTR150000010010          0  0RA              409347    0100000125000001250000140000NN  NNE 000                            
  C:\path\path_DCO17 December\DCO_CYC15_E_15122017.DCO:374:RDG15000001KH01R000000000K00000100000000271000012152017000000N000000000000UMETERSENS000000000K 10000000000000000267  

我关心的是第3行,但是这3行信息都有用,所以我想导出这个。

这行代码为我提供了我希望输出的数据:

$Found | Select * -ExcludeProperty RowError, RowState, HasErrors, Table, ItemArray, IgnoreCase, Context | Export-Excel

LineNumber : 373
Line       : MTR150000010010          0  0RA              409347    0100000125000001250000140000NN  NNE 000                            
Filename   : DCO_CYC15_E_15112017_2.DCO
Path       : P:\path\path_DCO17 November\DCO_CYC15_E_15112017_2.DCO
Pattern    : 409347
Matches    : {0}

但是,那只是 "Line:" 属性 中的匹配行。 如何包含 -Context 中的另外两行?

如果那不可能,我很满意这一行,即 -Context 1 输出的第 3 行:

 RDG15000001KH01R000000000K00000100000000271000012152017000000N000000000000UMETERSENS000000000K 10000000000000000267

如果无法获取全部 3 行,如何将其切换为包含在导出中的行数据?

注: 这一切都是在一个循环中完成的。在这种情况下,只有 1 个匹配项,但可以有多个。

$Found = @()
Foreach ($folder in $folders)
{
    $Found += gci $folder -filter *.dco -Recurse | Select-String -Pattern $pattern -Context 1 
    if ($Found) {
        $Found | Select * -ExcludeProperty RowError, RowState, HasErrors, Table, ItemArray, IgnoreCase, Context | Export-Excel -Path $savepathr -WorkSheetname "$pattern" -AutoSize -BoldTopRow -FreezeTopRow
        $row.Status = "Found in File"
    }
}

谢谢,希望你明白我在问什么。

使用计算的 属性 从 Context 属性 中获取第 3 行:

$Found | Select *,@{Name='PostContext';Expression={$_.Context.PostContext}} -ExcludeProperty RowError, RowState, HasErrors, Table, ItemArray, IgnoreCase, Context | Export-Excel -Path $savepathr -WorkSheetname "$pattern" -AutoSize -BoldTopRow -FreezeTopRow

由于 $Found += ... 语句随后导出到目前为止捕获的所有找到的实例,您当前的循环将导致重复。

$Found = foreach ($folder in $folders) {
    Get-ChildItem $folder -Filter *.dco -Recurse | Select-String -Pattern $pattern -Context 1 
}
if ($Found) {
    $Found | Select *,@{Name='PostContext';Expression={$_.Context.PostContext}} -ExcludeProperty RowError, RowState, HasErrors, Table, ItemArray, IgnoreCase, Context | Export-Excel -Path $savepathr -WorkSheetname "$pattern" -AutoSize -BoldTopRow -FreezeTopRow
    $row.Status = "Found in File"
}