Files
AH-Oil-Trader/scripts/send_daily_report.ps1
T
Axel HocksandClaude Opus 5 da863371d3 .ps1 braucht ein BOM: Autologon-Skript brach unter powershell.exe 5.1
Das Skript liess sich nicht ausfuehren — "Schliessende ) fehlt",
"Zeichenfolge hat kein Abschlusszeichen". Es war KEIN Syntaxfehler:
Windows PowerShell 5.1 liest .ps1 als CP1252, wenn kein BOM da ist. Aus dem
Gedankenstrich werden drei Zeichen, das darin enthaltene Anfuehrungszeichen
schliesst den String vorzeitig, und der Fehler kaskadiert bis zum Dateiende.

Der eigentliche Punkt ist, warum es beim Schreiben nicht auffiel: das hiesige
PowerShell-Werkzeug ist pwsh 7, und das liest UTF-8 ohne BOM klaglos. Die Datei
war in meiner Umgebung fehlerfrei und beim Nutzer kaputt — dieselbe
Divergenz-Klasse wie der Deployment-Drift, nur eine Ebene tiefer: die
Pruefumgebung war nicht die Laufumgebung.

Behoben (UTF-8 MIT BOM) und mit dem ECHTEN 5.1-Parser gegengeprueft
(Parser::ParseFile, 0 Fehler) — nicht mit pwsh 7, das den Fehler ja gerade
nicht zeigt.

Dabei ein zweiter Fall gefunden und mitbehoben: scripts/send_daily_report.ps1
(Umlaute, kein BOM). Der ist zwar dormant (Microsoft.Graph-Modul fehlt), haette
aber genauso gebrochen.

Dauerhaft abgesichert: tools/check_nfalle.py prueft es als Stufe C2 —
.ps1 mit Nicht-ASCII und ohne BOM ist ab jetzt ein Befund.

.bat ist nicht betroffen: cmd.exe verzeiht das in echo/Kommentaren
(restart_server.bat enthaelt Sonderzeichen, bricht aber nicht).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 06:38:42 +02:00

64 lines
2.9 KiB
PowerShell

# send_daily_report.ps1
# Sendet täglich um 0 Uhr eine HTML-Zusammenfassung aller Trades des Vortages.
$python = "C:\Users\ah\AppData\Local\Programs\Python\Python312\python.exe"
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$pyScript = Join-Path $scriptDir "daily_summary.py"
# ── Graph-Credentials aus oil_widget_config.ini ([graph]) ─────────────────
# Secrets gehören nicht ins Skript — zentrale Config wie bei den API-Keys.
$iniPath = Join-Path (Split-Path -Parent $scriptDir) "oil_widget_config.ini"
$graph = @{}
$inGraph = $false
foreach ($line in Get-Content $iniPath -Encoding UTF8) {
if ($line -match '^\s*\[(.+)\]') { $inGraph = ($Matches[1] -eq 'graph'); continue }
if ($inGraph -and $line -match '^\s*(\w+)\s*=\s*(.+?)\s*$') {
$graph[$Matches[1]] = $Matches[2]
}
}
$tenantId = $graph['tenant_id']
$clientId = $graph['client_id']
$clientSecret = $graph['client_secret']
if (-not $tenantId -or -not $clientId -or -not $clientSecret) {
Write-Error "Abschnitt [graph] in $iniPath fehlt oder ist unvollständig."
exit 1
}
# ── Zusammenfassung aus Python holen ────────────────────────────────────────
$yesterday = (Get-Date).AddDays(-1).ToString("yyyy-MM-dd")
# -join: Python gibt mehrere Zeilen aus → PowerShell macht ein String-Array daraus.
# Ohne -join würde nur die erste Zeile (<html>) als Content ankommen → leere Mail.
$htmlBody = (& $python $pyScript $yesterday 2>&1) -join "`n"
if ([string]::IsNullOrWhiteSpace($htmlBody) -or $htmlBody -match "Traceback|Error:") {
$htmlBody = "<p>Fehler beim Generieren des Reports für $yesterday.</p><pre>$htmlBody</pre>"
}
$subject = "Oil Trading $((Get-Date).AddDays(-1).ToString('dd.MM.yyyy'))"
# ── Microsoft Graph verbinden ────────────────────────────────────────────────
$secureSecret = ConvertTo-SecureString $clientSecret -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($clientId, $secureSecret)
Connect-MgGraph -TenantId $tenantId -ClientSecretCredential $cred -NoWelcome
# ── E-Mail senden ────────────────────────────────────────────────────────────
$params = @{
Message = @{
Subject = $subject
Body = @{
ContentType = "HTML"
Content = $htmlBody
}
ToRecipients = @(
@{ EmailAddress = @{ Address = "axel@hocks.eu" } }
)
From = @{
EmailAddress = @{ Address = "mailagent@hocks.eu" }
}
}
}
Send-MgUserMail -UserId "mailagent@hocks.eu" -BodyParameter $params
Write-Output "Report gesendet: $subject"