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

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

有沒有辦法整理成一張大表方便快速尋找呢?又該 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

Post a comment