我想在目录中的文件中搜索多个字符串,但是使用“select-string -pattern”没有帮助。谁能告诉我怎么做?
示例:搜索包含“VendorEnquiry”和“失败”字样的C:\ Logs中的所有文件,并在上午11:30左右使用Logtime。文件结构可能不同(例如,不同的标签名称等):
... <methodException>VendorEnquiry</methodException> ...
... <logTime>13/10/2010T11:30:04 am</logTime> ...
... <status>Failed</status> ...
... <serviceMethodException>VendorEnquiry</serviceMethodException> ...
... <logTime>13/10/2010</logTime> ...
... <serviceStatus>Failed</serviceStatus> ...
感谢。
答案 0 :(得分:26)
如果您想以任意顺序匹配这两个单词,请使用:
gci C:\Logs| select-string -pattern '(VendorEnquiry.*Failed)|(Failed.*VendorEnquiry)'
如果在线上的VendorEnquiry之后总是出现失败,请使用:
gci C:\Logs| select-string -pattern '(VendorEnquiry.*Failed)'
答案 1 :(得分:24)
要在每个文件中搜索多个匹配项,我们可以对多个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',...
现在,为了满足“上午11:30左右的Logtime”部分示例,需要找到与每个失败条目相对应的日志时间。如何做到这一点在很大程度上取决于文件的实际结构,但测试“约”相对简单:
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
答案 2 :(得分:-1)
select-string VendorEnquiry,Failed C:\Logs