Существуют альтернативные способы сделать это.
Преобразовать каждую найденную дату в объект DateTime и сравнить с определенной контрольной датой. Используйте -like
, чтобы ограничить поиск только строками, содержащими указанный поисковый запрос.
$referenceTime = (Get-Date '2019-02-25 19:09:00').AddMinutes(-10)
$wildcardSearch = '*ERROR*'
Get-Content -Path 'D:\SomeLog.log' |
Where-Object { $_ -like $wildcardSearch -and (Get-Date ($_ -split ',')[0]) -gt $referenceTime }
ForEach-Object {
# do something here, for demo just output the
$_
}
Или, поскольку даты и время все в сортируемом формате, вам не нужно преобразовывать в DateTime. В этой демонстрации используется регулярное выражение -match
для сравнения поискового запроса
# the reference time in sortable string format, as are the dates in the log
$referenceTime = '{0:yyyy-MM-dd HH:mm:ss}' -f (Get-Date '2019-02-25 19:09:00').AddMinutes(-10)
# simple words like ERROR do not need escaping, but other search terms might
$regexSearch = [regex]::Escape('ERROR')
Get-Content -Path 'D:\SomeLog.log' |
Where-Object { $_ -match $regexSearch -and ($_ -split ',')[0] -gt $referenceTime } |
ForEach-Object {
# do something here, for demo just output the
$_
}
Или используйте самый быстрый способ перебора строк в журнале (опять же, используя регулярное выражение):
$referenceTime = '{0:yyyy-MM-dd HH:mm:ss}' -f (Get-Date '2019-02-25 19:09:00').AddMinutes(-10)
$regexSearch = [regex]::Escape('ERROR')
switch -Regex -File 'D:\SomeLog.log' {
$regexSearch {
if (($_ -split ',')[0] -gt $referenceTime) {
# do something here, for demo just output the line
$_
}
}
}