我正在研究一些没有强大的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
我的输出看起来像
接下来我要做的是
删除标记属性及其下方行的行,以及我将很快将输出发送到EventLog。
仅选择不早于特定日期的行。
那么我该如何拒绝这两行呢?关于日期问题,我希望排除早于我指定的特定日期的行。
我已经读过Select-String
有一个-Exclude <String>
属性。
使用此指令排除具有特定日期的行以及如何执行此操作是否明智(当然可能) - 比方说,例如,拒绝任何超过一周的行?
提前感谢。
安德鲁
答案 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