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 {
查找有关以下代码段的信息,它实际上做了预期的事情。它检索过去 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 {