From e012342d0d68187edd6f4de1b4348b3fe59a3c00 Mon Sep 17 00:00:00 2001 From: claude_dev Date: Tue, 1 Sep 2026 20:49:35 +0800 Subject: [PATCH] =?UTF-8?q?fix(data):=20register=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E5=AF=B9=E9=BD=90VPS=E7=8E=B0=E5=9C=BA=E5=91=BD=E5=90=8D+ak-mo?= =?UTF-8?q?nthly=E6=94=B9XML=E6=B3=A8=E5=86=8C=E2=80=94=E2=80=9409-01?= =?UTF-8?q?=E6=99=9A=E5=AE=9E=E6=B5=8B=E6=9A=B4=E9=9C=B2=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E6=BC=82=E7=A7=BB:08-20=20schtask=E9=87=8D=E7=BB=84=E5=B7=B2?= =?UTF-8?q?=E6=94=B9=E5=90=8Dak-daily/ak-monthly/ak-weekly(wrapper?= =?UTF-8?q?=E4=B8=8D=E5=8F=98)=E4=BD=86=E6=9C=AC=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E6=B2=A1=E8=B7=9F=E4=B8=8A,=E9=87=8D=E8=B7=91=E6=97=A7?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=3D=E6=8B=BF=E8=BF=87=E6=9C=9F=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E6=94=B9=E7=8E=B0=E5=9C=BA:=E2=91=A0=E5=A4=8D?= =?UTF-8?q?=E6=B4=BB=E4=B8=8Eak-weekly=E5=AE=8C=E5=85=A8=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84ak-stock(=E5=90=8Cwrapper=E5=90=8C=E5=91=A8=E5=85=AD03?= =?UTF-8?q?:00=E4=BC=9A=E5=8F=8C=E5=BC=80=E5=B9=B6=E5=8F=91,=E5=B7=B2?= =?UTF-8?q?=E7=8E=B0=E5=9C=BA=E5=88=A0=E9=99=A4)=E2=91=A1ak-quarter?= =?UTF-8?q?=E8=A1=8C=E3=80=8C/m=E6=9C=88=E4=BB=BD=E5=88=97=E8=A1=A8+/d=20S?= =?UTF-8?q?AT=E3=80=8D=E5=9C=A8zh-CN=20schtasks=E6=8A=A5=E3=80=8C/D?= =?UTF-8?q?=E9=80=89=E9=A1=B9=E6=97=A0=E6=95=88=E3=80=8D=E6=A0=B9=E6=9C=AC?= =?UTF-8?q?=E6=B2=A1=E6=B3=A8=E5=86=8C=E4=B8=8A;=E4=BF=AE=3D=E2=91=A0?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=90=8D=E5=AF=B9=E9=BD=90=E7=8E=B0=E5=9C=BA?= =?UTF-8?q?=E5=85=AD=E4=BB=B6=E5=A5=97(daily19:00/events19:30/weekly?= =?UTF-8?q?=E5=91=A8=E5=85=AD03:00/monthly=E9=A6=96=E5=91=A8=E5=85=AD02:00?= =?UTF-8?q?/vintage09:00/index16=E5=8F=B719:50)=E2=91=A1monthly=E6=94=B9?= =?UTF-8?q?=E5=B5=8CXML(ScheduleByMonthDayOfWeek=20Weeks=3D1=20Saturday,Ou?= =?UTF-8?q?t-File=20Unicode+Schtasks=20/create=20/xml,=E7=BB=95=E5=BC=80zh?= =?UTF-8?q?-CN=E6=98=9F=E6=9C=9F=E5=90=8D=E9=99=90=E5=88=B6)=E2=91=A2?= =?UTF-8?q?=E5=A4=B4=E6=B3=A8=E9=87=8A=E8=AE=B0=E5=91=BD=E5=90=8D=E5=8F=B2?= =?UTF-8?q?+=E4=BA=8B=E6=95=85=E9=93=BE=E9=98=B2=E9=87=8D=E6=BC=94;?= =?UTF-8?q?=E7=8E=B0=E5=9C=BA=E5=B7=B2=E5=90=8C=E6=AC=BE=E4=BF=AE=E5=AE=8C?= =?UTF-8?q?(ak-monthly=20next=3D9/5=E9=A6=96=E5=91=A8=E5=85=AD,=E9=A1=BA?= =?UTF-8?q?=E5=B8=A6=E5=91=A8=E6=9C=AB=E5=85=A8=E8=A7=84=E6=A8=A1=E9=A2=84?= =?UTF-8?q?=E6=BC=94=E6=96=B0=E4=BB=A3=E7=A0=81)=20[vps]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../register_akshare_schtasks.ps1 | 113 +++++++++++++----- 1 file changed, 86 insertions(+), 27 deletions(-) diff --git a/scripts/data_platform/register_akshare_schtasks.ps1 b/scripts/data_platform/register_akshare_schtasks.ps1 index 13e7549..f72130b 100644 --- a/scripts/data_platform/register_akshare_schtasks.ps1 +++ b/scripts/data_platform/register_akshare_schtasks.ps1 @@ -1,29 +1,88 @@ -# register_akshare_schtasks.ps1 — 注册 akshare 低频 5 schtask (spec §14.5 A+B+C) -# akshare per-stock 全量慢+东财限流 → 夜间/周末/财报季; akshare_static_download 内置断路器(连30 failed exit)+0.8s sleep -# 时间错开 bs-eod(18:05)/xt-eod(18:40) 之后, 无并发 +# register_akshare_schtasks.ps1 — 注册 akshare 静态数据 schtask (与 VPS 现场命名一致) # -# 坑(2026-07-24 实证): PowerShell 调 `schtasks /tr "...$ws\xxx.ps1"` 时, 双引号内反斜杠路径被 -# 原生命令参数解析吃掉 → Arguments 丢前缀变 `\xxx.ps1` → schtask 触发成功但 powershell 找不到文件静默退出, 不写日志。 -# (Get-ScheduledTask 在中文 Win 报 0x80070057, 用 `schtasks /query /tn X /xml` 查 Arguments 才发现) -# 修复: 全路径硬编码 + `--%` stop-parsing 让 PowerShell 原样传参给 schtasks (反斜杠不丢)。 -schtasks --% /create /tn sanguo-ak-eod /tr "powershell -ExecutionPolicy Bypass -File C:\sanguo_vnpy_v2\scripts\data_platform\ak_eod_wrapper.ps1" /sc daily /st 19:00 /ru SYSTEM /rl HIGHEST /f -schtasks --% /create /tn sanguo-ak-events /tr "powershell -ExecutionPolicy Bypass -File C:\sanguo_vnpy_v2\scripts\data_platform\ak_events_wrapper.ps1" /sc daily /st 19:30 /ru SYSTEM /rl HIGHEST /f -schtasks --% /create /tn sanguo-ak-stock /tr "powershell -ExecutionPolicy Bypass -File C:\sanguo_vnpy_v2\scripts\data_platform\ak_stock_wrapper.ps1" /sc weekly /d SAT /st 03:00 /ru SYSTEM /rl HIGHEST /f -# ak-quarter: 财报月首个周六 02:00 (2026-09-01 事故修正: 旧 /d 缺省=每月1号02:00, -# 夜间窗口 7.5h 连一张表(~8h)都装不下, 09-01 首爆 balance 02:00-10:01 / income -# 10:01-18:17 穿整个交易日, 09:32 决策窗撞两表 vintage 撕裂 → value 清仓。 -# 首个周六 02:00 → 周一 09:30 有 55h 跑道; 月内 1-4 号读旧但一致, 策略配对兼容) -schtasks --% /create /tn sanguo-ak-quarter /tr "powershell -ExecutionPolicy Bypass -File C:\sanguo_vnpy_v2\scripts\data_platform\ak_quarter_wrapper.ps1" /sc monthly /m APR,MAY,SEP,NOV /d SAT /st 02:00 /ru SYSTEM /rl HIGHEST /f -# ak-vintage: 每日 09:00 静态表 vintage 一致性自检 (防线④: 撕裂/断更告警退出码 3, -# 落 data/static/vintage_status.json 供策略盘前预判) -schtasks --% /create /tn sanguo-ak-vintage /tr "powershell -ExecutionPolicy Bypass -File C:\sanguo_vnpy_v2\scripts\data_platform\ak_vintage_wrapper.ps1" /sc daily /st 09:00 /ru SYSTEM /rl HIGHEST /f -schtasks --% /create /tn sanguo-index /tr "powershell -ExecutionPolicy Bypass -File C:\sanguo_vnpy_v2\scripts\data_platform\index_monthly_wrapper.ps1" /sc monthly /d 16 /st 19:50 /ru SYSTEM /rl HIGHEST /f -Write-Output "=== VERIFY Arguments 路径(应全路径, 非 \xxx.ps1)===" -foreach ($t in @('sanguo-ak-eod','sanguo-ak-events','sanguo-ak-stock','sanguo-ak-quarter','sanguo-ak-vintage','sanguo-index')) { - $xml = schtasks /query /tn $t /xml 2>&1 | Out-String - if ($xml -match 'File\s+([^<"]+)') { - Write-Output (" {0,-20} File {1}" -f $t, $matches[1]) - } else { - Write-Output (" {0,-20} (路径未找到)" -f $t) - } +# ⚠️ 命名史 (2026-09-01 事故教训): +# 2026-08-20 schtask 重组把任务改名为 ak-daily/ak-monthly/ak-weekly (wrapper 不变), +# 但本脚本当时没跟上, 仍是旧名 ak-eod/ak-quarter/ak-stock——09-01 晚重跑旧脚本: +# ① 复活了与 ak-weekly 完全重复的 ak-stock (同 wrapper 同时刻, 会双开并发) +# ② ak-quarter 行 /d SAT 在 zh-CN schtasks 上报「/D 选项无效」(/m 月份列表+英文星期 +# 组合不被接受), 月度任务根本没注册上 +# 修复: ak-stock 已删、ak-monthly 已改 XML 首周六; 本脚本重写为现场命名+XML 方式。 +# +# 任务地图 (跑完核对): +# sanguo-ak-daily daily 19:00 ak_eod_wrapper.ps1 (valuation+financial_abstract) +# sanguo-ak-events daily 19:30 ak_events_wrapper.ps1 +# sanguo-ak-weekly weekly SAT 03:00 ak_stock_wrapper.ps1 +# sanguo-ak-monthly 财报月(APR,MAY,SEP,NOV)首个周六 02:00 ak_quarter_wrapper.ps1 ← XML 方式 +# sanguo-ak-vintage daily 09:00 ak_vintage_wrapper.ps1 (vintage 一致性自检, 2026-09-01 新增) +# sanguo-index monthly 16 19:50 index_monthly_wrapper.ps1 +# +# ak-monthly 为何 XML: ①zh-CN schtasks 不吃 "/m APR,MAY,SEP,NOV /d SAT" (09-01 实测 +# 报「/D 选项无效」) ②洗库单趟 20h+, 月内1号02:00 只有 7.5h 夜窗必穿交易日 (09-01 +# 首爆 16h+ 穿全天, 09:32 决策窗撞两表 vintage 撕裂致 value 清仓), 首个周六有 55h 跑道。 +# +# 坑(2026-07-24 实证): PowerShell 调 schtasks 时双引号内反斜杠路径被吃 → 用 --% 或全路径; +# 查 Arguments 用 `schtasks /query /tn X /xml` (Get-ScheduledTask 在中文 Win 报 0x80070057)。 + +$env:http_proxy = '' +$env:https_proxy = '' +$env:all_proxy = '' + +schtasks --% /create /tn sanguo-ak-daily /tr "powershell -ExecutionPolicy Bypass -File C:\sanguo_vnpy_v2\scripts\data_platform\ak_eod_wrapper.ps1" /sc daily /st 19:00 /ru SYSTEM /rl HIGHEST /f +schtasks --% /create /tn sanguo-ak-events /tr "powershell -ExecutionPolicy Bypass -File C:\sanguo_vnpy_v2\scripts\data_platform\ak_events_wrapper.ps1" /sc daily /st 19:30 /ru SYSTEM /rl HIGHEST /f +schtasks --% /create /tn sanguo-ak-weekly /tr "powershell -ExecutionPolicy Bypass -File C:\sanguo_vnpy_v2\scripts\data_platform\ak_stock_wrapper.ps1" /sc weekly /d SAT /st 03:00 /ru SYSTEM /rl HIGHEST /f +schtasks --% /create /tn sanguo-ak-vintage /tr "powershell -ExecutionPolicy Bypass -File C:\sanguo_vnpy_v2\scripts\data_platform\ak_vintage_wrapper.ps1" /sc daily /st 09:00 /ru SYSTEM /rl HIGHEST /f +schtasks --% /create /tn sanguo-index /tr "powershell -ExecutionPolicy Bypass -File C:\sanguo_vnpy_v2\scripts\data_platform\index_monthly_wrapper.ps1" /sc monthly /d 16 /st 19:50 /ru SYSTEM /rl HIGHEST /f + +# sanguo-ak-monthly: 财报月首个周六 02:00 (XML: zh-CN schtasks 不支持 /d 星期名+/m 月份列表) +$monthlyXml = @' + + + + 财报季月(APR/MAY/SEP/NOV)首个周六 02:00 akshare 三表+预告/快报 --force 全量洗库(单趟20h+只能周末跑) + + + + 2026-07-24T02:00:00 + true + + + 1 + + + + + + + + + + + + false + false + PT0S + IgnoreNew + + + + powershell + -ExecutionPolicy Bypass -File C:\sanguo_vnpy_v2\scripts\data_platform\ak_quarter_wrapper.ps1 + + + + + S-1-5-18 + HighestAvailable + + + +'@ +$xmlPath = Join-Path $env:TEMP 'sanguo_ak_monthly_task.xml' +$monthlyXml | Out-File -FilePath $xmlPath -Encoding Unicode +schtasks /create /tn sanguo-ak-monthly /xml "$xmlPath" /f +Remove-Item $xmlPath -ErrorAction SilentlyContinue + +Write-Output "=== VERIFY 下次运行时间 (应: daily=明19:00 / events=明19:30 / weekly=周六03:00 / monthly=财报月首个周六02:00 / vintage=明09:00 / index=16号19:50) ===" +foreach ($t in @('sanguo-ak-daily','sanguo-ak-events','sanguo-ak-weekly','sanguo-ak-monthly','sanguo-ak-vintage','sanguo-index')) { + schtasks /query /tn $t /fo LIST /v | Select-String -Pattern '下次运行时间|Next Run Time' | ForEach-Object { Write-Output (" {0,-18} {1}" -f $t, $_.Line.Trim()) } }