0

在下面的代码中寻找信息,它实际上做了预期的事情。它检索过去 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

我对powershell脚本很陌生,并且在其他堆栈溢出问题上发现了相同的错误消息,但场景似乎与此完全不同,有人可以帮我解决这个问题吗?谢谢

4

2 回答 2

1

您可能需要清除$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%,但我没有合适的自定义任务来过滤。两者最终都为所有测试提供了相同的准确记录。

于 2020-11-02T23:26:32.150 回答
1

我猜你有一个没有匹配 200 / 201 ID 的分组 ActivityID。(在您运行脚本期间未完成的任务)

如果您只想完成已完成并具有 $end 值的任务 - 看看像这样修改第 6 行是否可以解决问题:

} | Group-Object ActivityID | Where-Object {$_.Count -gt 1} | ForEach-Object {
于 2020-11-03T02:58:06.047 回答