遇到系統在半夜出現異常,老司機都會先釐清當時是否有排程在執行?

「工作排程器」的排程項目眾多,又是多層式資料夾,一一打開檢查看很惱人。

有沒有辦法整理成一張大表方便快速尋找呢?又該 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 標示語法說明可參考官方文件

有了這個小工具,未來要清查排程執行時間就方便多了~

【參考資料】

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通知管理員全部排程的工作詳細狀況如工作啟動與工作完成時間,所以才需要特別抓工作排程內的工作完成時間

Post a comment