跳转至

计划任务命令

概述

Windows计划任务用于自动执行程序、脚本或系统维护任务,可以按时间、事件或系统状态触发。

schtasks命令

schtasks - 计划任务管理工具

schtasks命令

创建、删除、查询、更改、运行和结束计划任务。

创建计划任务

Text Only
schtasks /create /tn "任务名" /tr "程序路径" /sc 计划类型 [/st 时间] [/sd 日期] [/ed 日期] [/d 天数] [/m 月份] [/i 空闲时间] [/rl 级别] [/ru 用户] [/rp 密码]

计划类型: - MINUTE:每分钟 - HOURLY:每小时 - DAILY:每天 - WEEKLY:每周 - MONTHLY:每月 - ONCE:一次 - ONSTART:系统启动时 - ONLOGON:用户登录时 - ONIDLE:系统空闲时

示例

Text Only
# 创建每天运行的任务
schtasks /create /tn "DailyBackup" /tr "C:\Scripts\backup.bat" /sc daily /st 02:00

# 创建每小时运行的任务
schtasks /create /tn "HourlyCheck" /tr "C:\Scripts\check.bat" /sc hourly

# 创建每周运行的任务(每周一)
schtasks /create /tn "WeeklyReport" /tr "C:\Scripts\report.bat" /sc weekly /d MON /st 08:00

# 创建每月运行的任务(每月1号)
schtasks /create /tn "MonthlyTask" /tr "C:\Scripts\task.bat" /sc monthly /d 1 /st 09:00

# 创建开机启动任务
schtasks /create /tn "OnStartup" /tr "C:\Scripts\startup.bat" /sc onstart

# 创建用户登录时运行的任务
schtasks /create /tn "OnLogon" /tr "C:\Scripts\logon.bat" /sc onlogon

# 创建系统空闲时运行的任务(空闲30分钟)
schtasks /create /tn "OnIdle" /tr "C:\Scripts\idle.bat" /sc onidle /i 30

# 以最高权限运行
schtasks /create /tn "AdminTask" /tr "C:\Scripts\admin.bat" /sc daily /rl HIGHEST

# 指定用户运行
schtasks /create /tn "UserTask" /tr "C:\Scripts\task.bat" /sc daily /ru "DOMAIN\username" /rp password

# 创建一次性任务
schtasks /create /tn "OneTime" /tr "C:\Scripts\once.bat" /sc once /st 15:00 /sd 12/31/2025

查询计划任务

Text Only
1
2
3
4
5
6
7
8
schtasks /query                          # 查询所有任务
schtasks /query /tn "任务名"             # 查询特定任务
schtasks /query /fo LIST                 # 列表格式
schtasks /query /fo TABLE                # 表格格式(默认)
schtasks /query /fo CSV                  # CSV格式
schtasks /query /v                       # 详细信息
schtasks /query /xml                     # XML格式
schtasks /query /xml /tn "任务名"        # 特定任务XML

运行计划任务

Text Only
schtasks /run /tn "任务名"               # 立即运行任务
schtasks /run /tn "任务名" /i            # 忽略限制立即运行

结束计划任务

Text Only
schtasks /end /tn "任务名"               # 结束正在运行的任务

删除计划任务

Text Only
1
2
3
schtasks /delete /tn "任务名"            # 删除特定任务
schtasks /delete /tn "任务名" /f         # 强制删除(不确认)
schtasks /delete /fo LIST                # 删除所有任务

更改计划任务

Text Only
schtasks /change /tn "任务名" [选项]

# 更改运行时间
schtasks /change /tn "DailyBackup" /st 03:00

# 更改运行程序
schtasks /change /tn "DailyBackup" /tr "C:\Scripts\newbackup.bat"

# 启用任务
schtasks /change /tn "DailyBackup" /enable

# 禁用任务
schtasks /change /tn "DailyBackup" /disable

# 更改用户
schtasks /change /tn "DailyBackup" /ru "DOMAIN\newuser" /rp password

从XML创建任务

Text Only
1
2
3
4
5
# 导出任务为XML
schtasks /query /tn "DailyBackup" /xml > task.xml

# 从XML创建任务
schtasks /create /tn "NewTask" /xml task.xml

PowerShell计划任务

获取计划任务

PowerShell
1
2
3
4
Get-ScheduledTask                      # 所有任务
Get-ScheduledTask -TaskName "Backup"   # 特定任务
Get-ScheduledTask | Where-Object {$_.State -eq "Ready"}  # 就绪的任务
Get-ScheduledTask | Where-Object {$_.State -eq "Running"}  # 运行中的任务

创建计划任务

PowerShell
# 创建触发器
$trigger = New-ScheduledTaskTrigger -Daily -At 2am
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At 8am
$trigger = New-ScheduledTaskTrigger -AtStartup
$trigger = New-ScheduledTaskTrigger -AtLogon

# 创建动作
$action = New-ScheduledTaskAction -Execute "C:\Scripts\backup.bat"
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\Scripts\script.ps1"

# 创建设置
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -DontStopOnIdleEnd

# 注册任务
Register-ScheduledTask -TaskName "DailyBackup" -Trigger $trigger -Action $action -Settings $settings

# 以系统账户运行
Register-ScheduledTask -TaskName "SystemTask" -Trigger $trigger -Action $action -User "SYSTEM"

# 以最高权限运行
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest
Register-ScheduledTask -TaskName "AdminTask" -Trigger $trigger -Action $action -Principal $principal

启用/禁用任务

PowerShell
Disable-ScheduledTask -TaskName "Backup"
Enable-ScheduledTask -TaskName "Backup"

运行/停止任务

PowerShell
Start-ScheduledTask -TaskName "Backup"
Stop-ScheduledTask -TaskName "Backup"

删除任务

PowerShell
Unregister-ScheduledTask -TaskName "Backup"
Unregister-ScheduledTask -TaskName "Backup" -Confirm:$false

导出/导入任务

PowerShell
1
2
3
4
5
6
# 导出
Export-ScheduledTask -TaskName "Backup" | Out-File "backup.xml"

# 导入
$xml = Get-Content "backup.xml"
Register-ScheduledTask -TaskName "NewBackup" -Xml $xml

任务计划程序GUI

Text Only
taskschd.msc                         # 打开任务计划程序
control schedtasks                   # 另一种方式打开

常见任务模板

系统维护任务

Text Only
1
2
3
4
5
6
7
8
# 磁盘清理
schtasks /create /tn "DiskCleanup" /tr "cleanmgr /sagerun:1" /sc weekly /d SUN /st 03:00

# 系统备份
schtasks /create /tn "SystemBackup" /tr "wbadmin start backup -backupTarget:D: -include:C: -quiet" /sc daily /st 02:00

# 事件日志归档
schtasks /create /tn "ArchiveLogs" /tr "C:\Scripts\archive_logs.bat" /sc monthly /d 1 /st 04:00

监控任务

Text Only
1
2
3
4
5
# 服务监控
schtasks /create /tn "MonitorServices" /tr "C:\Scripts\check_services.ps1" /sc minute /mo 5

# 磁盘空间监控
schtasks /create /tn "DiskSpaceCheck" /tr "C:\Scripts\check_disk.ps1" /sc hourly

数据同步任务

Text Only
1
2
3
4
5
# 文件同步
schtasks /create /tn "FileSync" /tr "robocopy \\server\share C:\local /mir" /sc daily /st 01:00

# 数据库备份
schtasks /create /tn "DBBackup" /tr "C:\Scripts\db_backup.bat" /sc daily /st 02:00

任务触发器详解

多重触发器

PowerShell
1
2
3
4
5
$triggers = @(
    (New-ScheduledTaskTrigger -Daily -At 8am),
    (New-ScheduledTaskTrigger -Weekly -DaysOfWeek Friday -At 5pm)
)
Register-ScheduledTask -TaskName "MultiTrigger" -Trigger $triggers -Action $action

事件触发器

PowerShell
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 30) -RepetitionDuration (New-TimeSpan -Days 1)

任务条件与设置

PowerShell
1
2
3
4
5
6
7
8
9
# 创建条件设置
$settings = New-ScheduledTaskSettingsSet `
    -StartWhenAvailable `
    -DontStopOnIdleEnd `
    -AllowStartIfOnBatteries `
    -DontStopIfGoingOnBatteries `
    -ExecutionTimeLimit (New-TimeSpan -Hours 2)

Register-ScheduledTask -TaskName "MyTask" -Trigger $trigger -Action $action -Settings $settings

实用脚本

批量创建监控任务

PowerShell
1
2
3
4
5
6
7
$servers = @("Server1", "Server2", "Server3")
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\Scripts\monitor.ps1"

foreach ($server in $servers) {
    $trigger = New-ScheduledTaskTrigger -Daily -At 6am
    Register-ScheduledTask -TaskName "Monitor_$server" -Trigger $trigger -Action $action
}

查找失败的任务

PowerShell
Get-ScheduledTask | Where-Object {$_.LastTaskResult -ne 0} | 
    Select-Object TaskName, LastTaskResult, LastRunTime

清理旧任务

PowerShell
1
2
3
$cutoffDate = (Get-Date).AddDays(-30)
Get-ScheduledTask | Where-Object {$_.LastRunTime -lt $cutoffDate -and $_.State -eq "Disabled"} | 
    Unregister-ScheduledTask -Confirm:$false

参考资料