को खोजने के लिए प्रत्येक फ़ाइल में कई मैचों, हम कई चयन-स्ट्रिंग कॉल अनुक्रमित कर सकते हैं:
Get-ChildItem C:\Logs |
where { $_ | Select-String -Pattern 'VendorEnquiry' } |
where { $_ | Select-String -Pattern 'Failed' } |
...
प्रत्येक चरण में, जिन फ़ाइलों में वर्तमान पैटर्न नहीं है, उन्हें फ़िल्टर किया जाएगा, यह सुनिश्चित करने के लिए कि फ़ाइलों की अंतिम सूची में सभी खोज शब्द शामिल हैं।
बल्कि मैन्युअल रूप से प्रत्येक का चयन-स्ट्रिंग कॉल बाहर लिखने की तुलना में, हम कई प्रतिमानों से मिलान करने के लिए एक फिल्टर के साथ इस आसान बनाने में कर सकते हैं:
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 के बारे बजे" को पूरा करने के भाग उदाहरण के लिए प्रत्येक विफलता प्रविष्टि के अनुरूप लॉग समय खोजने की आवश्यकता होगी। इस फ़ाइलों की वास्तविक संरचना पर बहुत निर्भर है, लेकिन "के बारे में" के लिए परीक्षण करने के लिए कैसे अपेक्षाकृत सरल है:
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
स्रोत
2011-10-16 15:22:25
मैं XML पार्सिंग का उपयोग नहीं करना चाहते हैं की वजह से भारी लॉग फ़ाइलों के लिए बहुत धीमी गति से प्रदर्शन। मुझे कुछ तेज़ चाहिए। रेगेक्स अच्छा है हालांकि मुझे नहीं पता कि मैं उस अभिव्यक्ति को कैसे लिख सकता हूं जो उस फ़ाइल में खोज करता है जहां एक शब्द वेंडरएक्विरी और असफल मौजूद है। – Thomas