# Daily report: generate + push to WeCom webhook # Usage: # .\run-daily.ps1 # .\run-daily.ps1 -SkipPush # .\run-daily.ps1 -SkipGenerate # .\run-daily.ps1 -Force # bypass duplicate-run lock param( [switch]$SkipPush, [switch]$SkipGenerate, [switch]$Force ) $ErrorActionPreference = "Stop" $Root = Split-Path -Parent $MyInvocation.MyCommand.Path Set-Location $Root $LockFile = Join-Path $Root ".cache\run-daily.lock" $LockMaxMinutes = 30 function Import-DotEnvFile { param([string]$Path) if (-not (Test-Path $Path)) { return } Get-Content $Path -Encoding UTF8 | ForEach-Object { if ($_ -match '^\s*#' -or $_ -notmatch '=') { return } $pair = $_ -split '=', 2 if ($pair.Count -eq 2) { $name = $pair[0].Trim() $value = $pair[1].Trim().Trim('"').Trim("'") if ($name -and $value) { Set-Item -Path "Env:$name" -Value $value } } } } function Test-RunDailyLock { if (-not (Test-Path $LockFile)) { return $false } $age = (Get-Date) - (Get-Item $LockFile).LastWriteTime return $age.TotalMinutes -lt $LockMaxMinutes } function Set-RunDailyLock { $dir = Split-Path $LockFile -Parent if (-not (Test-Path $dir)) { New-Item -ItemType Directory -Path $dir -Force | Out-Null } Set-Content -Path $LockFile -Value (Get-Date -Format "o") -Encoding UTF8 } function Clear-RunDailyLock { if (Test-Path $LockFile) { Remove-Item $LockFile -Force -ErrorAction SilentlyContinue } } if (-not $Force -and (Test-RunDailyLock)) { Write-Host "Skip: run-daily already ran within ${LockMaxMinutes} minutes (lock: $LockFile). Use -Force to override." exit 0 } Set-RunDailyLock try { Import-DotEnvFile (Join-Path $Root ".env") Import-DotEnvFile (Join-Path $Root ".env.local") $python = "python" $date = Get-Date -Format "yyyy-MM-dd" $reportWecom = Join-Path $Root "output\$date.wecom.md" if (-not $SkipGenerate) { Write-Host "Generating daily report: $date" & $python -m daily generate if ($LASTEXITCODE -ne 0) { throw "daily generate failed with exit code $LASTEXITCODE" } } if (-not $SkipPush) { if (-not (Test-Path $reportWecom)) { throw "Report not found: $reportWecom" } Write-Host "Pushing to WeCom webhook..." & $python -m daily push $reportWecom if ($LASTEXITCODE -ne 0) { throw "daily push failed with exit code $LASTEXITCODE" } } Write-Host "Done: $date" } finally { Clear-RunDailyLock }