#计划任务
计划任务用于在指定时间或周期自动运行脚本,不依赖当前打开的终端会话。PowerShell 在 Windows 上通过 ScheduledTasks 模块管理任务,在 Linux 和 macOS 上则需要使用系统自带的调度工具。
#Windows:ScheduledTasks 模块
Windows 上的任务通常由三部分组成:
- 操作(Action):要运行的程序及参数,由
New-ScheduledTaskAction创建。 - 触发器(Trigger):运行时机,由
New-ScheduledTaskTrigger创建。 - 注册(Register):把操作和触发器组合成任务,由
Register-ScheduledTask完成。
> $action = New-ScheduledTaskAction -Execute "$PSHOME\pwsh.exe" `
-Argument '-NoProfile -File C:\scripts\backup.ps1'
> $trigger = New-ScheduledTaskTrigger -Daily -At '03:00'
> Register-ScheduledTask -TaskName 'DailyBackup' `
-Action $action -Trigger $trigger -Description '每天凌晨备份'
只运行一次:
> $trigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(5)
> Register-ScheduledTask -TaskName 'RunOnce' -Action $action -Trigger $trigger
常用的管理命令:
> Get-ScheduledTask -TaskName 'DailyBackup'
> Start-ScheduledTask -TaskName 'DailyBackup'
> Unregister-ScheduledTask -TaskName 'DailyBackup'
Get-ScheduledTask查看任务及其状态。Start-ScheduledTask立即手动运行一次。Unregister-ScheduledTask删除任务,加-Confirm:$false可跳过确认。- 创建以 SYSTEM 身份或需要最高权限运行的任务通常需要管理员权限。
#Linux 与 macOS:系统调度工具
非 Windows 平台没有 ScheduledTasks 模块,需要使用各自系统的机制:
| 平台 | 工具 | 用途 |
|---|---|---|
| Linux | cron | 按分钟级周期运行命令 |
| Linux | systemd timer | 与 systemd 集成,支持更精细的触发条件 |
| macOS | launchd | 系统原生的定时与守护进程管理 |
使用 cron 运行 PowerShell 脚本:
$ crontab -e
在编辑器中加入一行,表示每天 3 点执行:
0 3 * * * /usr/bin/pwsh -NoProfile -File /home/user/scripts/backup.ps1
使用 systemd timer 时,需要分别创建 .service 与 .timer 单元,然后启用定时器:
$ systemctl --user enable --now backup.timer
$ systemctl --user list-timers
macOS 的 launchd 通过 .plist 文件定义任务,将其放入 ~/Library/LaunchAgents/ 后使用 launchctl 加载。
#注意事项
计划任务运行时通常没有交互式终端,应避免依赖用户输入或图形界面。脚本中使用绝对路径,并确认运行账户对脚本、输入文件和日志目录具有相应权限。任务的环境变量和工作目录也可能与手动运行时不同,建议在脚本中显式设置。