寻找以下代码的信息,它实际上做的是预期的事情。它检索“CreateTimesheets”任务过去7天的持续时间。但是,它以错误消息结束。
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
我对powershell脚本非常陌生,并在其他堆栈溢出问题上发现了相同的错误消息,但情况似乎与此完全不同,有人能帮我澄清一下吗?谢谢
发布于 2020-11-02 23:26:32
您可能需要清除$start
和$end
变量,以确保值不会从前一个组中结转。这可能会显示导致错误的记录。我不能重复这个问题。根据您正在处理的条目的数量,在分组之前筛选出任务名称可能也是有益的。最后,使用[PSCustomObject]
类型的加速器而不是New-Object
稍微快一些。在第一个示例中,我对您的代码做了一些调整,然后对后面的相同版本做了一些调整。
更新原件
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%,但我没有合适的自定义任务可供筛选。最后,两者都为所有测试提供了相同的准确记录。
https://stackoverflow.com/questions/64650500
复制相似问题