Powershell 在最后一次出现字符串后从文本文件中获取行

Powershell getting lines from a text file after the last occurrence of a string

我有一个正在使用的 robocopy 日志文件,我需要使用 powershell 提取摘要行。我 运行 遇到的问题是摘要的行数长度并不总是相同。

假设日志文件如下所示:

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows                              
-------------------------------------------------------------------------------

  Started : Tue Dec 01 06:55:11 2015

   Source : C:\Source Path
     Dest : E:\Destination Path

    Files : *.*

  Options : *.* /TEE /S /E /COPY:DAT /PURGE /MIR /NP /R:2 /W:2 

------------------------------------------------------------------------------
List of files here
List of files here
List of files here
------------------------------------------------------------------------------
                Total    Copied   Skipped  Mismatch    FAILED    Extras
     Dirs :       945         0       945         0         0         0
    Files :     10118         4     10114         0         0         3
    Bytes :   1.245 g   323.9 k   1.244 g         0         0         0
    Times :   0:00:17   0:00:00                       0:00:00   0:00:17

    Speed :             5264920 Bytes/sec.
    Speed :             301.261 MegaBytes/min.

    Ended : Tue Dec 01 06:55:28 2015

我可以用命令$summary = Get-Content $log | Select-Object -last 11 | Out-String静态获取文件的最后11行,但是只有当数据实际移动时才会列出这两条速度线,否则会导致文件的最后一行列表。最终不是一个大问题,但它看起来不是很漂亮。

在最后一次(或第 4 次,总是有 4 次)出现分隔符 --------------- 之后,我如何从文件中获取最后一行而不是设定的行数?

我找到了解决方案,但我觉得必须有更好的方法。第一个命令找到所有分隔符,并将行号输出到 $finds 数组,然后是第二行,使用 $finds 数组中的最后一个元素作为提取摘要的起点。

希望这对其他人有帮助!

$finds = Get-Content $log | Select-string "--------------" | Select-Object LineNumber

$summary = Get-Content $log | Select-Object -skip $finds[-1]."LineNumber" | Out-String
Get-Content $log | Select-String 'Total' -Context 0,20

解释:Select-STring 查找任何包含 'Total' 的行。参数 -Context 0,20 告诉它在匹配行之后最多显示 20 行(之前为零行)。

如果你复制一个像'sales_total.txt'这样的文件,这一行也会匹配。为防止这种情况,您可以使匹配字符串更明确。例如使用完整的行。

试试这个:

Get-Content $log -Delimiter ('-'*78) |
Select -last 1