नीचे दिए गए कोड के बारे में जानकारी की तलाश में, यह वास्तव में वही करता है जो इसकी अपेक्षा करता है। यह पिछले 7 दिनों के लिए 'CreateTimesheets' कार्य की समय अवधि को पुनः प्राप्त करता है। हालांकि यह एक त्रुटि संदेश के साथ समाप्त होता है।
Get-WinEvent -FilterHashtable @{
'LogName' = 'Microsoft-Windows-TaskScheduler/Operational'
'ID' = 200, 201
'StartTime' = [datetime]::Today.AddDays(-7)
'EndTime' = [datetime]::Today
} | Group-Object ActivityID | ForEach-Object {
if($_.Group.Properties[0].Value -like '*CreateTimesheets*'){
$start = $_.Group |
Where-Object { $_.Id -eq 200 } |
Select-Object -Expand TimeCreated -First 1
$end = $_.Group |
Where-Object { $_.Id -eq 201 } |
Select-Object -Expand TimeCreated -First 1
New-Object -Type PSObject -Property @{
'TaskName' = $_.Group[0].Properties[0].Value
'StartTime' = $start
'Duration' = ($end - $start).TotalSeconds
} }
}
त्रुटि संदेश इस प्रकार है
Cannot find an overload for "op_Subtraction" and the argument count: "2".
At line:15 char:12
+ New-Object -Type PSObject -Property @{
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodException
+ FullyQualifiedErrorId : MethodCountCouldNotFindBest
मैं पावरहेल स्क्रिप्टिंग के लिए काफी नया हूं और अन्य स्टैक ओवरफ्लो प्रश्नों पर एक ही त्रुटि संदेश मिला है लेकिन परिदृश्य इसके लिए काफी अलग हैं, क्या कोई इसे मेरे लिए साफ़ कर सकता है? धन्यवाद
2 जवाब
मेरा अनुमान है कि आपके पास 200/201 आईडी से मेल खाने के बिना समूहबद्ध गतिविधि आईडी है। (वह कार्य जो आपकी स्क्रिप्ट चलाने के दौरान समाप्त नहीं हुआ था)
यदि आप केवल उन कार्यों को करना चाहते हैं जो समाप्त हो चुके हैं और एक $ अंत मूल्य है - देखें कि क्या इस तरह से लाइन 6 को संशोधित करना चाल है:
} | Group-Object ActivityID | Where-Object {$_.Count -gt 1} | ForEach-Object {
आप केवल यह सुनिश्चित करने के लिए $start
और $end
वेरिएबल को हटाना चाहेंगे कि मान पिछले समूह से आगे नहीं बढ़ रहे हैं। इससे पता चल सकता है कि कौन से रिकॉर्ड (रिकॉर्ड्स) त्रुटि पैदा कर रहे हैं। मैं इस मुद्दे को डुप्लिकेट करने में सक्षम नहीं था। आपके द्वारा संसाधित की जा रही प्रविष्टियों की मात्रा के आधार पर समूहीकरण से पहले कार्यनाम को फ़िल्टर करना भी फायदेमंद हो सकता है। अंत में, New-Object
के बजाय [PSCustomObject]
टाइप एक्सेलेरेटर का उपयोग करना थोड़ा तेज़ है। मैंने पहले उदाहरण में आपके कोड में कुछ समायोजन किए हैं और उसके बाद उसी चीज़ का थोड़ा अलग संस्करण बनाया है।
मूल अपडेट किया गया
Get-WinEvent -FilterHashtable @{
'LogName' = 'Microsoft-Windows-TaskScheduler/Operational'
'ID' = 200, 201
'StartTime' = [datetime]::Today.AddDays(-7)
'EndTime' = [datetime]::Today
} | Group-Object ActivityID | ForEach-Object {
if($_.Group.Properties[0].Value -like '*CreateTimesheets*'){
Remove-Variable start,end -ErrorAction SilentlyContinue
$start = $_.Group |
Where-Object { $_.Id -eq 200 } |
Select-Object -Expand TimeCreated -First 1
$end = $_.Group |
Where-Object { $_.Id -eq 201 } |
Select-Object -Expand TimeCreated -First 1
[PSCustomObject]@{
TaskName = $_.Group.Properties[0].Value
StartTime = $start
Duration = ($end - $start).TotalSeconds
}
}
}
एक और संभावित संस्करण
Get-WinEvent -FilterHashtable @{
'LogName' = 'Microsoft-Windows-TaskScheduler/Operational'
'ID' = 200, 201
'StartTime' = [datetime]::Today.AddDays(-7)
'EndTime' = [datetime]::Today
} | Where-Object Message -match "CreateTimesheets" | Group-Object ActivityID | ForEach-Object {
Remove-Variable start,end -ErrorAction SilentlyContinue
$start,$end = $_.Group.where({$_.Id -eq 200 },'split').timecreated
[PSCustomObject]@{
TaskName = $_.Group.Properties[0].Value
StartTime = $start
Duration = ($end - $start).TotalSeconds
}
}
समायोजित संस्करण ने मूल से ~ 10% तेज परीक्षण किया लेकिन मेरे पास फ़िल्टर करने के लिए उपयुक्त कस्टम कार्य नहीं था। दोनों ने अंत में सभी परीक्षणों के लिए समान सटीक रिकॉर्ड प्रदान किए।