Skip to main content

技術存檔

Windows 工作排程器 匯出所有排程

以 CSV 格式:

schtasks /query /fo CSV /v > AP6_tasks.csv

YMT AP03 匯出方式

$svc = New-Object -ComObject "Schedule.Service"
$svc.Connect()

# State 代碼對照(COM 回傳的是數字)
$stateMap = @{ 0='Unknown'; 1='Disabled'; 2='Queued'; 3='Ready'; 4='Running' }

# 遞迴收集每個資料夾的工作
function Get-TaskList($folder) {
    $folder.GetTasks(1) | ForEach-Object {   # 1 = 連隱藏工作也抓
        $t = $_
        $def = $t.Definition
        # 取第一個「執行程式」動作的命令(Type 0 = Exec)
        $act = $def.Actions | Where-Object { $_.Type -eq 0 } | Select-Object -First 1
        $cmd = if ($act) { ("$($act.Path) $($act.Arguments)").Trim() } else { '' }
        $next = try { $t.NextRunTime } catch { $null }

        [PSCustomObject]@{
            Path       = $t.Path
            Name       = $t.Name
            State      = $stateMap[[int]$t.State]
            Enabled    = $t.Enabled
            NextRun    = $next
            LastRun    = $t.LastRunTime
            LastResult = ('0x{0:X8}' -f [int]$t.LastTaskResult)
            Author     = $def.RegistrationInfo.Author
            RunAsUser  = $def.Principal.UserId
            Command    = $cmd
        }
    }
    foreach ($sub in $folder.GetFolders(0)) { Get-TaskList $sub }   # 遞迴子資料夾
}

# 確保輸出資料夾存在
$out = "C:\Users\ymtauser\Downloads\Empty\AP3_tasks.csv"
if (-not (Test-Path "C:\Temp")) { New-Item -ItemType Directory "C:\Temp" | Out-Null }

# 收集 → 排序 → 匯出(UTF-8 含 BOM,Excel 開中文不亂碼)
$tasks = Get-TaskList $svc.GetFolder("\")
$tasks | Sort-Object Path, Name | Export-Csv -Path $out -NoTypeInformation -Encoding UTF8

Write-Host "共匯出 $($tasks.Count) 筆工作到 $out"