半夜系統異常之調查小幫手 - 工作排程執行時間一覽表
6 | 3,045 |
遇到系統在半夜出現異常,老司機都會先釐清當時是否有排程在執行?
「工作排程器」的排程項目眾多,又是多層式資料夾,一一打開檢查看很惱人。
有沒有辦法整理成一張大表方便快速尋找呢?又該 PowerShell 上場救援惹...
直接看成果:
Get-ScheduledTask | ForEach-Object {
$item = $_
[string]$path = $item.TaskPath
[string]$name = $item.TaskName
$info = $item | Get-ScheduledTaskInfo
$lastRunTime = $info.LastRunTime
if ($lastRunTime) { $lastRunTime = [DateTime]::Parse($lastRunTime).ToString('yyyy-MM-dd HH:mm:ss') }
$nextRunTime = $info.NextRunTime
if ($nextRunTime) { $nextRunTime = [DateTime]::Parse($nextRunTime).ToString('yyyy-MM-dd HH:mm:ss') }
$lastTaskResult = $info.LastTaskResult
if ($lastTaskResult -ne 0) { $lastTaskResult = '0x{0:x}' -f $lastTaskResult }
$schTime = ($item.Triggers | Select-Object -ExpandProperty StartBoundary | ForEach-Object { [DateTime]::Parse($_).ToString('[HH:mm:ss]') })
if ($schTime) { $schTime = $schTime -join ', ' }
[string]$repetition = ($item.Triggers.Repetition | Select-Object -ExpandProperty interval)
if ($repetition) { $schTime += ' / ' + $repetition }
[string]$duration = ($item.Triggers.Repetition | Select-Object -ExpandProperty duration)
if ($duration) { $schTime += ' / ' + $duration }
return [PSCustomObject]@{
Path = $path
Name = $name
SchTime = $schTime
LastRunTime = $lastRunTime
NextRunTime = $nextRunTime
LastTaskResult = $lastTaskResult
}
} | ConvertTo-Csv -NoTypeInformation | Out-File schtask-list.csv -Encoding utf8
將所有排程的路徑、名稱、排定時間、上次執行時間、下次執行時間、上次執行結果做成 CSV,用 Excel 開啟檢視,一目了然:
其中最有用的是 SchTime 欄位,可以查到排程設定的啟動時間,時間後方接的 PT1H、P1D 是多久重複一次,持續多久,13:55:42 / PT1H / P1D 代表 13:55:42 起一小時執行一次,持續一天(如下圖)。P1D、PT30M 標示語法說明可參考官方文件。
有了這個小工具,未來要清查排程執行時間就方便多了~
【參考資料】
- Stackoverflow: How to get trigger details associated with a task in task scheduler from powershell?
- MS Learn: Get-ScheduledTaskInfo
Example PowerShell script to list all scheduled task info to find tasks which run at specific period.
Comments
# by Huang
全部排程都放在一層XD
# by popo
請問有辦法撈出工作排程 歷程記錄的最新一筆工作已完成時間嗎
# by Jeffrey
to popo,查詢結果已有上次執行時間,強調已完成時間是因為排程會執行很久?
# by popo
To Jeffrey 因為我們有用robocopy備份資料並用工作排程定時備份,會需要查看歷程記錄"工作已完成"的時間來做紀錄,我參考很多文件實作都沒辦法撈出該特定資料
# by Jeffrey
to popo,若需求單純是要抓 robocopy 完成時間,有考慮過寫個 Batch 檔,在 robocopy 後方加個 `time /t >> robocopy.log`(CMD) 簡單搞定?
# by popo
to Jeffrey 謝謝回覆,因備份都在排程上,本上robocopy是有log可以查看,但想要在固定時間發mail通知管理員全部排程的工作詳細狀況如工作啟動與工作完成時間,所以才需要特別抓工作排程內的工作完成時間