首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >尽管检索了所需的结果,但创建自定义psobject时仍然出现了op_Subtraction错误

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

Stack Overflow用户
提问于 2020-11-02 17:35:54
回答 2查看 279关注 0票数 0

寻找以下代码的信息,它实际上做的是预期的事情。它检索“CreateTimesheets”任务过去7天的持续时间。但是,它以错误消息结束。

代码语言:javascript
运行
复制
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
    } }
 }

错误消息如下所示

代码语言:javascript
运行
复制
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脚本非常陌生,并在其他堆栈溢出问题上发现了相同的错误消息,但情况似乎与此完全不同,有人能帮我澄清一下吗?谢谢

EN

Stack Overflow用户

发布于 2020-11-02 23:26:32

您可能需要清除$start$end变量,以确保值不会从前一个组中结转。这可能会显示导致错误的记录。我不能重复这个问题。根据您正在处理的条目的数量,在分组之前筛选出任务名称可能也是有益的。最后,使用[PSCustomObject]类型的加速器而不是New-Object稍微快一些。在第一个示例中,我对您的代码做了一些调整,然后对后面的相同版本做了一些调整。

更新原件

代码语言:javascript
运行
复制
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
        }
    }
}

另一个可能的版本

代码语言:javascript
运行
复制
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%,但我没有合适的自定义任务可供筛选。最后,两者都为所有测试提供了相同的准确记录。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64650500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档