解析行不超过特定日期

时间:2015-02-06 16:57:19

标签: parsing powershell

我正在研究一些没有强大的PowerShell技能的PowerShell脚本。基本上我更喜欢Java,但我需要使用PowerShell来完成一些工作。

到目前为止我所拥有的是一个小片段,它解析我想要的日志文件,返回一个对象并将其写入文件。

# find all lines with "successfully installed":
Select-String -Path $env:windir\WindowsUpdate.log -Pattern 'successfully installed' |
 ForEach-Object {
   $information = $_ | Select-Object -Property Date, Product
   $parts = $_.Line -split '\t'
   [DateTime]$information.Date = $parts[0] + ' ' + $parts[1].SubString(0,8)
   $information.Product = ($_.Line -split 'following update: ')[-1]
   $information
  } | Out-File parsedUpdate.log 

我的输出看起来像enter image description here

接下来我要做的是

  1. 删除标记属性及其下方行的行,以及我将很快将输出发送到EventLog。

  2. 仅选择不早于特定日期的行。

  3. 那么我该如何拒绝这两行呢?关于日期问题,我希望排除早于我指定的特定日期的行。

    我已经读过Select-String有一个-Exclude <String>属性。

    使用此指令排除具有特定日期的行以及如何执行此操作是否明智(当然可能) - 比方说,例如,拒绝任何超过一周的行?

    提前感谢。

    安德鲁

2 个答案:

答案 0 :(得分:1)

实际日志条目的时间戳采用字符串可排序格式,因此您可以在创建对象之前尽早进行日期过滤:

$Start = (get-date).AddDays(-7).ToString('yyyy-MM-dd')

Select-String -Path $env:windir\WindowsUpdate.log -Pattern 'successfully installed' |
Where {$_.line -gt $Start} |

答案 1 :(得分:0)

您需要为(2)部分问题做的就是在结果集中添加一个过滤器,因为您已经拥有了Date属性的对象。 filter子句看起来像Where-Object { $_.Date -ge "2/6/2015" }只是替换为您感兴趣的日期。

# find all lines with "successfully installed" no older than 2/6/2015:
Select-String -Path $env:windir\WindowsUpdate.log -Pattern 'successfully installed' |
 ForEach-Object {
   $information = $_ | Select-Object -Property Date, Product
   $parts = $_.Line -split '\t'
   [DateTime]$information.Date = $parts[0] + ' ' + $parts[1].SubString(0,8)
   $information.Product = ($_.Line -split 'following update: ')[-1]
   $information
  } | Where-Object { $_.Date -ge "2/6/2015" } | Out-File parsedUpdate.log