获取有关 Windows 计划任务持续时间(执行时间)的信息

Posted

技术标签:

【中文标题】获取有关 Windows 计划任务持续时间(执行时间)的信息【英文标题】:Get informations on Windows Scheduled Task duration (execution time) 【发布时间】:2019-04-08 16:27:02 【问题描述】:

我们有几台服务器,上面有数百个计划任务……找到合适的维护窗口变得越来越困难。 是否有一些工具允许 Windows 任务调度程序事件的图形表示(如甘特图)?

除此之外,我一直在摆弄 Powershell 来自己实现该工具,使用 get-scheduledtaskget-scheduledtaskinfo,但是虽然它们确实提供了属性 LastRunTimeNextRunTime ,但我找不到关于 任务的持续时间。 我的意思是,如果我在上午 9 点开始一项任务,并且线程在 9.10 返回,我确实在历史 gui 中看到它运行了 10 分钟..,但我无法使用 Powershell 获得相同的信息。 有什么提示吗? 谢谢!

【问题讨论】:

【参考方案1】:

您要查找的信息不会作为任务的属性保存。您需要从任务历史记录中提取它。动作的开始和结束分别使用 ID 200 和 201 记录。

Get-WinEvent -FilterHashtable @
    'LogName' = 'Microsoft-Windows-TaskScheduler/Operational'
    'ID'      = 200, 201
 | Group-Object ActivityID | ForEach-Object 
    $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
    

【讨论】:

这是黄金。请告诉我你在构建这个时至少犯了一个错误...... 不知道错误,但我一点一点拼凑起来(确定历史存储的位置 -> 确定要查询的 ID -> 确定用于对结果进行分组的属性...... )。 真的,它是黄金。我能想到的唯一问题是它非常慢......在我们的一台生产服务器(16 核 Xeon v5、128Gb RAM 和企业级固态存储)上,大约有 100 个时间表和 6 个月的历史,它花了大约15 分钟的执行时间 第一次分析(出乎意料),最慢的部分是事件的提取。关于XML转换..有必要吗? $_.Group.properties[0].value 似乎已经包含了任务的名称.. 还是我遗漏了什么? @Aldo $_.Group.Properties[0] 确实足够了。我忽略了这一点。在我的答案中修复。至于负持续时间:我的示例代码只是演示了一般原则。它不处理任何边缘情况。【参考方案2】:

以下是一些使用 Get-WinEvent 命令查询事件的技巧。 要搜索所需的任务名称,请构造一个 XPath xml 并通过 -FilterXml 参数传递它 要限制事件计数,请使用 -MaxEvents

    #Timeframe to look 
# Last 24H -> 24*60*60*1000 = 86400000
$TimeInterval = 24 * 60 * 60 * 1000

# paths for scheduled tasks in Task Scheduler namespace:
$TaskName = '\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319'

# must be even as we need a minimum of two events - 200 + 201
$EventsToGet = 2

$XMLQuery_TaskScheduler = @"
<QueryList>
  <Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
    <Select Path="Microsoft-Windows-TaskScheduler/Operational">*[System[(EventID=200 or EventID=201) and TimeCreated[timediff(@SystemTime) &lt;= $($TimeInterval)]] and EventData/Data[@Name='TaskName']='$($TaskName)']</Select>
  </Query>
</QueryList>
"@


$TestEvents = Get-WinEvent -FilterXml $XMLQuery_TaskScheduler -MaxEvents $EventsToGet -ErrorAction Stop
$TestEvents.Count

$TestEvents | Group-Object 'ActivityID' | ForEach-Object 
# use the great code above by Ansgar Wiechers
...


【讨论】:

以上是关于获取有关 Windows 计划任务持续时间(执行时间)的信息的主要内容,如果未能解决你的问题,请参考以下文章

windows计划任务执行mysqldump大数据表不成功小数据表没问题

Windows任务计划程序启动程序时如何获取应用程序文件夹

怎么让windows计划任务每隔几分钟运行一次?

除非用户登录,否则 VB6 应用程序不会按计划任务执行

使用 Windows 任务计划程序打开 cmd 文件时执行但不启动服务器

windows 建立任务执行计划 自动执行脚本