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

时间:2018-11-05 10:10:49

标签: windows powershell scheduled-tasks taskscheduler

我们有几台服务器,上面有数百个预定的任务……而寻找合适的维护窗口变得越来越困难。 是否有一些工具可以Windows Task Scheduler事件的图形表示形式(如甘特图)?

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

2 个答案:

答案 0 :(得分:4)

您要查找的信息不会保留为任务的属性。您需要从任务历史中提取它。动作的开始和结束分别以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
    }
}

答案 1 :(得分:0)

以下是使用Get-WinEvent comandlet查询事件的一些技巧。 要搜索所需的任务名称,请构造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
...

}