计划任务命令
概述
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 |
|---|
| 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 |
|---|
| 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 |
|---|
| # 导出任务为XML
schtasks /query /tn "DailyBackup" /xml > task.xml
# 从XML创建任务
schtasks /create /tn "NewTask" /xml task.xml
|
PowerShell计划任务
获取计划任务
| PowerShell |
|---|
| 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 |
|---|
| # 导出
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 |
|---|
| # 磁盘清理
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 |
|---|
| # 服务监控
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 |
|---|
| # 文件同步
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 |
|---|
| $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 |
|---|
| # 创建条件设置
$settings = New-ScheduledTaskSettingsSet `
-StartWhenAvailable `
-DontStopOnIdleEnd `
-AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries `
-ExecutionTimeLimit (New-TimeSpan -Hours 2)
Register-ScheduledTask -TaskName "MyTask" -Trigger $trigger -Action $action -Settings $settings
|
实用脚本
批量创建监控任务
| PowerShell |
|---|
| $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 |
|---|
| $cutoffDate = (Get-Date).AddDays(-30)
Get-ScheduledTask | Where-Object {$_.LastRunTime -lt $cutoffDate -and $_.State -eq "Disabled"} |
Unregister-ScheduledTask -Confirm:$false
|
参考资料