Чтобы найти несколько совпадений в каждом файле, мы можем упорядочить несколько вызовов Select-String:
Get-ChildItem C:\Logs |
where { $_ | Select-String -Pattern 'VendorEnquiry' } |
where { $_ | Select-String -Pattern 'Failed' } |
...
На каждом шаге файлы, которые не содержат текущий шаблон, будут отфильтровываться, гарантируя, что окончательный список файлов содержит все условия поиска.
Вместо того чтобы записывать каждый вызов Select-String вручную, мы можем упростить это с помощью фильтра для соответствия нескольким шаблонам:
filter MultiSelect-String( [string[]]$Patterns ) {
# Check the current item against all patterns.
foreach( $Pattern in $Patterns ) {
# If one of the patterns does not match, skip the item.
$matched = @($_ | Select-String -Pattern $Pattern)
if( -not $matched ) {
return
}
}
# If all patterns matched, pass the item through.
$_
}
Get-ChildItem C:\Logs | MultiSelect-String 'VendorEnquiry','Failed',...
Теперь, чтобы удовлетворить «Logtime около 11:30 am», часть примера потребовала бы найти время регистрации, соответствующее каждой записи об ошибке. Как это сделать, сильно зависит от фактической структуры файлов, но тестирование на предмет «примерно» относительно просто:
function AboutTime( [DateTime]$time, [DateTime]$target, [TimeSpan]$epsilon ) {
$time -le ($target + $epsilon) -and $time -ge ($target - $epsilon)
}
PS> $epsilon = [TimeSpan]::FromMinutes(5)
PS> $target = [DateTime]'11:30am'
PS> AboutTime '11:00am' $target $epsilon
False
PS> AboutTime '11:28am' $target $epsilon
True
PS> AboutTime '11:35am' $target $epsilon
True