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

Posted

技术标签:

【中文标题】创建自定义 psobject 时出现 op_Subtraction 错误,尽管检索到了所需的结果【英文标题】:op_Subtraction error when creating a custom psobject, despite desired results retrieved 【发布时间】:2020-11-02 17:35:54 【问题描述】:

在下面的代码中寻找信息,它实际上做了预期的事情。它检索过去 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 脚本很陌生,并且在其他堆栈溢出问题上发现了相同的错误消息,但场景似乎与此完全不同,有人可以帮我解决这个问题吗?谢谢

【问题讨论】:

当您到达 New-Object ... 语句时,$end$start 看起来是空的(或者至少 不是 [datetime] 对象)。 【参考方案1】:

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

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

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

【讨论】:

谢谢,成功了。【参考方案2】:

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

【讨论】:

感谢 Doug 提供了非常丰富的答案,是的,我想知道如何在分组之前按任务名称进行过滤,但不知道该怎么做!欣赏它。

以上是关于创建自定义 psobject 时出现 op_Subtraction 错误,尽管检索到了所需的结果的主要内容,如果未能解决你的问题,请参考以下文章

Access 2013 - 自定义 Web 应用程序 - 创建时出现“访问被拒绝”错误

在 QLayout 中创建和删除自定义 QWidget 时出现 RAM 问题

使用 Angular 材质定义自定义主题时出现 SassError

在 DialogFragment 中为 AlertDialog 膨胀自定义视图时出现问题

在情节提要中自定义表格视图单元格时出现 NSInternalInconsistencyException

使用自定义框架时出现“找不到图像”错误