如何调整PowerShell脚本统计任务计划程序指定任务的执行时长
多任务执行时长统计调整方案
调整思路
原有代码仅支持单任务过滤,我们通过动态生成多任务匹配的XPath过滤规则,实现指定多个任务的筛选,同时优化了异常场景兼容。
完整可运行代码
# 定义要统计的目标任务名称列表,可根据需求自行增删 $targetTaskNames = @( "001_task_A_nightly", "002_task_B_daily", "003_task_C_hourly" ) $logName = 'Microsoft-Windows-TaskScheduler/Operational' # 动态生成多任务匹配的XPath过滤条件 $taskFilterSegments = $targetTaskNames | ForEach-Object { "Data[@Name='TaskName'] = `"$_`"" } $taskFilter = $taskFilterSegments -join " or " $xPathFilter = @" *[ System[(EventID=200 or EventID=201)] and EventData[ $taskFilter ] ] "@ # 查询日志并统计执行时长 Get-WinEvent -LogName $logName -FilterXPath $xPathFilter | Group-Object ActivityID | ForEach-Object { $startEvent = $_.Group | Where-Object Id -eq 200 | Select-Object -First 1 $endEvent = $_.Group | Where-Object Id -eq 201 | Select-Object -First 1 # 跳过只有启动/结束事件的异常执行记录 if ($startEvent -and $endEvent) { [PSCustomObject]@{ TaskName = $startEvent.Properties[0].Value ExecutionStart = $startEvent.TimeCreated ExecutionEnd = $endEvent.TimeCreated DurationSeconds = [math]::Round(($endEvent.TimeCreated - $startEvent.TimeCreated).TotalSeconds, 2) } } }
使用说明
- 任务名称需要和事件日志中记录的完全一致,如果任务存放在任务计划的子文件夹下,需要带上完整路径,比如
\自定义任务分组\001_task_A_nightly - 首次使用需要确认日志已启用:打开事件查看器,依次进入「应用程序和服务日志 > Microsoft > Windows > TaskScheduler > Operational」,右键选择「启用日志」
- 如果仅需要查询最近一段时间的记录,可以给
Get-WinEvent添加-StartTime参数,例如-StartTime (Get-Date).AddDays(-7)只查询最近7天的记录,提升查询效率
内容的提问来源于stack exchange,提问作者djohnjohn
相关产品推荐
相关产品推荐

