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

时间:2015-12-01 16:30:44

标签: powershell robocopy

我有一个我正在使用的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个)出现之后从文件中获取最后一行?

3 个答案:

答案 0 :(得分:0)

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

希望这有助于其他人!

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

$summary = Get-Content $log | Select-Object -skip $finds[-1]."LineNumber" | Out-String

答案 1 :(得分:0)

Get-Content $log | Select-String 'Total' -Context 0,20

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

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

答案 2 :(得分:0)

试试这个:

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