op_Subtraction 创建自定义 psobject 时出错,尽管已检索到所需结果

op_Subtraction error when creating a custom psobject, despite desired results retrieved

查找有关以下代码段的信息,它实际上做了预期的事情。它检索过去 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 脚本编写的新手,在其他堆栈溢出问题上发现了相同的错误消息,但情况似乎与此大不相同,谁能帮我解决这个问题?谢谢

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

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

如果您只想执行已完成且具有 $end 值的任务 - 查看是否修改行 6 个这样就可以了:

} | Group-Object ActivityID | Where-Object {$_.Count -gt 1} | ForEach-Object {