fix(data): register脚本对齐VPS现场命名+ak-monthly改XML注册——09-01晚实测暴露脚本漂移:08-20 schtask重组已改名ak-daily/ak-monthly/ak-weekly(wrapper不变)但本脚本没跟上,重跑旧脚本=拿过期地图改现场:①复活与ak-weekly完全重复的ak-stock(同wrapper同周六03:00会双开并发,已现场删除)②ak-quarter行「/m月份列表+/d SAT」在zh-CN schtasks报「/D选项无效」根本没注册上;修=①任务名对齐现场六件套(daily19:00/events19:30/weekly周六03:00/monthly首周六02:00/vintage09:00/index16号19:50)②monthly改嵌XML(ScheduleByMonthDayOfWeek Weeks=1 Saturday,Out-File Unicode+Schtasks /create /xml,绕开zh-CN星期名限制)③头注释记命名史+事故链防重演;现场已同款修完(ak-monthly next=9/5首周六,顺带周末全规模预演新代码) [vps]
CI/CD / test (push) Successful in 21s
CI/CD / nas-deploy (push) Successful in 8s
CI/CD / nas-verify (push) Successful in 20s

This commit is contained in:
2026-09-01 20:49:35 +08:00
parent 7b7667e0ac
commit e012342d0d
@@ -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 = @'
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Description>财报季月(APR/MAY/SEP/NOV)首个周六 02:00 akshare 三表+预告/快报 --force 全量洗库(单趟20h+只能周末跑)</Description>
</RegistrationInfo>
<Triggers>
<CalendarTrigger>
<StartBoundary>2026-07-24T02:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByMonthDayOfWeek>
<Weeks>
<Week>1</Week>
</Weeks>
<DaysOfWeek>
<Saturday />
</DaysOfWeek>
<Months>
<April /><May /><September /><November />
</Months>
</ScheduleByMonthDayOfWeek>
</CalendarTrigger>
</Triggers>
<Settings>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
</Settings>
<Actions Context="Author">
<Exec>
<Command>powershell</Command>
<Arguments>-ExecutionPolicy Bypass -File C:\sanguo_vnpy_v2\scripts\data_platform\ak_quarter_wrapper.ps1</Arguments>
</Exec>
</Actions>
<Principals>
<Principal id="Author">
<UserId>S-1-5-18</UserId>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
</Task>
'@
$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()) }
}