获取有关 Windows 计划任务持续时间(执行时间)的信息
Get informations on Windows Scheduled Task duration (execution time)
我们有几台服务器,上面有数百个计划任务...找到合适的维护变得很成问题 window。
是否有一些工具允许 Windows 任务调度程序事件的图形表示(如甘特图)?
除此之外,我一直在摆弄 Powershell 来自己实现该工具,使用 get-scheduledtask
和 get-scheduledtaskinfo
,但是虽然它们确实提供了属性 LastRunTime
和 NextRunTime
,我找不到有关任务 duration 的信息。
我的意思是,如果我在上午 9 点开始任务,并且线程在 9 点 10 分返回,我确实在历史 gui 中看到它 运行 10 分钟......,但我无法使用 Powershell 获得相同的信息。
有什么提示吗?
谢谢!
您要查找的信息未保存为任务的 属性。您需要从任务历史记录中提取它。动作的开始和结束分别用 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
}
}
这里有一些使用 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) <= $($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
...
}
我们有几台服务器,上面有数百个计划任务...找到合适的维护变得很成问题 window。 是否有一些工具允许 Windows 任务调度程序事件的图形表示(如甘特图)?
除此之外,我一直在摆弄 Powershell 来自己实现该工具,使用 get-scheduledtask
和 get-scheduledtaskinfo
,但是虽然它们确实提供了属性 LastRunTime
和 NextRunTime
,我找不到有关任务 duration 的信息。
我的意思是,如果我在上午 9 点开始任务,并且线程在 9 点 10 分返回,我确实在历史 gui 中看到它 运行 10 分钟......,但我无法使用 Powershell 获得相同的信息。
有什么提示吗?
谢谢!
您要查找的信息未保存为任务的 属性。您需要从任务历史记录中提取它。动作的开始和结束分别用 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
}
}
这里有一些使用 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) <= $($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
...
}