Windows 分钟级定时任务(Agent 执行手册)
何时使用
用户提出"每 N 分钟执行一次"的定时需求(如:每 10 分钟推送微博热搜、每 5 分钟检查邮箱、每 30 分钟备份文件)。此时不要创建 WorkBuddy 内置自动化(见下方核心事实),改用本方案。
核心事实(2026-08 实测,不要重复验证)
- WorkBuddy 自动化调度器 RRULE 只支持
DAILY / HOURLY / WEEKLY / MONTHLY / YEARLY FREQ=MINUTELY创建时直接报错Unsupported RRULE frequencyFREQ=HOURLY;BYMINUTE=0,10,20,30,40,50可创建但 BYMINUTE 被忽略,next_run_at 全部被解析为"创建时间+1小时" → 每小时只触发 1 次- 结论:分钟级调度必须用 Windows 任务计划程序 + 独立脚本
执行流程(Agent 全自动完成,用户无需动手)
Step 1:确认需求
向用户确认两件事(若已明确可跳过):
- 任务内容:每分钟要执行什么?(如"抓取微博热搜发飞书")
- 间隔分钟数:N = 几?(如 10、5、30)
Step 2:生成脚本
在工作目录创建 <task_name>.py(任务名用小写英文+下划线,如 weibo_hot_push.py),脚本结构如下:
# -*- coding: utf-8 -*-
import json, os, subprocess, sys, urllib.request
from datetime import datetime
TASK_NAME = "<task_name>" # 任务名,用于日志识别
LOG_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), TASK_NAME + ".log")
def log(msg):
line = f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {msg}"
print(line)
with open(LOG_FILE, "a", encoding="utf-8") as f:
f.write(line + "\n")
def do_work():
"""写入用户的业务逻辑。返回 True=成功, False=失败。"""
# 在此实现具体任务(抓数据/发消息/处理文件)
# 失败时抛异常或返回 False
return True
def main():
log("=== 任务开始 ===")
try:
ok = do_work()
except Exception as e:
log(f"失败: {e}")
ok = False
log("=== 任务结束 " + ("成功" if ok else "失败") + " ===")
return 0 if ok else 1
if __name__ == "__main__":
sys.exit(main())
要点:
- 用绝对路径定位 python 解释器(如
C:/Users/<user>/.workbuddy/binaries/python/versions/3.13.12/python.exe),避免 PATH 差异 - 日志写入脚本同目录
.log,用于事后验证运行次数 - 业务逻辑集中在
do_work(),失败要有日志与返回码
Step 3:测试脚本
前台运行一次脚本,确认 === 任务结束 成功 === 且无报错:
<python绝对路径> <脚本绝对路径>
Step 4:注册 Windows 计划任务
用 PowerShell 执行(<间隔分钟> 填 N,<任务名> 用 myapp-10min 格式):
$python = '<python绝对路径>'
$script = '<脚本绝对路径>'
$workDir = '<脚本所在目录>'
$action = New-ScheduledTaskAction -Execute $python -Argument ('"{0}"' -f $script) -WorkingDirectory $workDir
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(1) -RepetitionInterval (New-TimeSpan -Minutes <间隔分钟>) -RepetitionDuration (New-TimeSpan -Days 365)
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -ExecutionTimeLimit (New-TimeSpan -Minutes 5) -MultipleInstances IgnoreNew
Register-ScheduledTask -TaskName "<任务名>-<间隔分钟>min" -Action $action -Trigger $trigger -Settings $settings -Description '<任务描述>' -Force
首次运行在 1 分钟后,之后每 N 分钟一次。
Step 5:验证
Get-ScheduledTask -TaskName "<任务名>-<间隔分钟>min"→ State 应为ReadyGet-ScheduledTaskInfo -TaskName "<任务名>-<间隔分钟>min"→ 记录 LastRunTime / NextRunTime- 等待首次触发后,检查脚本
.log出现新的"任务开始/结束"记录 - 向用户确认:任务已创建,每 N 分钟运行一次,首次运行时间
任务生命周期管理
- 修改间隔:删除后重建(
Unregister-ScheduledTask -TaskName X -Confirm:$false,再走 Step 4) - 暂停:
Disable-ScheduledTask -TaskName X(保留定义,可恢复) - 恢复:
Enable-ScheduledTask -TaskName X - 彻底删除:
Unregister-ScheduledTask -TaskName X -Confirm:$false
不影响其他定时任务(重要)
- Windows 计划任务与 WorkBuddy 内置自动化是两套独立系统,并行互不干扰
- 每个计划任务必须有唯一任务名,命名规范
<业务>-<间隔>min(如weibo-10min、backup-30min),重复命名会覆盖 - 多个分钟级任务并存无冲突
- 不要为分钟级需求创建 WorkBuddy 自动化(会造成每小时冗余触发,如上文核心事实)
已知坑(遇到即处理)
-RepetitionDuration ([TimeSpan]::MaxValue)报错任务 XML 包含格式不正确或超出范围的值→ 用有限时长(New-TimeSpan -Days 365)- PowerShell 输出被吞(某些环境 stdout 不显示)→ 用
*> $log重定向到文件再读取验证 schtasks等系统工具被安全策略禁用 → 用Register-ScheduledTask(本方案不依赖 schtasks)- 脚本路径含中文/空格 → PowerShell 参数用双引号包住(模板已处理)
- Git Bash 下运行
.cmdshim 路径转换崩溃(c:\c\...)→ 直接调用 node.exe 或 exe 完整路径
飞书消息发送(如需)
用 lark-cli(飞书连接器安装后可用):
node.exe <lark-cli安装目录>/node_modules/@larksuite/cli/scripts/run.js im +messages-send --user-id <ou_xxx> --text "<消息>" --as bot
- 用户身份可能缺
im:message.send_as_user权限 → 用--as bot - Python 中调用时用 subprocess 传参数列表(不经 shell),避免转义问题
