创建自定义 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 膨胀自定义视图时出现问题