param( [Parameter(Mandatory = $true)] [ValidateSet("Notifier", "BackupOnLogoff")] [string]$Task, [string]$TaskFolder = "BakRest" ) $ErrorActionPreference = "Stop" $repoRoot = Split-Path -Parent $PSScriptRoot $pythonExe = (& python -c "import sys; print(sys.executable)").Trim() if (-not $pythonExe -or -not (Test-Path -LiteralPath $pythonExe)) { $pythonCommand = Get-Command python -ErrorAction Stop $pythonExe = $pythonCommand.Source } if (-not (Test-Path -LiteralPath $pythonExe)) { throw "Python executable not found. Run this script from the same shell where 'python' works." } if ($Task -eq "Notifier") { $taskName = "$TaskFolder\ServerNotifierEvery30Minutes" $xmlPath = Join-Path $repoRoot "tasks\BakRestServerNotifierEvery30Minutes.xml" } else { $taskName = "$TaskFolder\BackupOnLogoff" $xmlPath = Join-Path $repoRoot "tasks\BakRestBackupOnLogoff.xml" } if (-not (Test-Path -LiteralPath $xmlPath)) { throw "Task XML not found: $xmlPath" } $xml = Get-Content -LiteralPath $xmlPath -Raw $xml = $xml -replace 'encoding="UTF-8"', 'encoding="UTF-16"' $xml = $xml -replace '.*?', ('{0}' -f [System.Security.SecurityElement]::Escape($pythonExe)) $xml = $xml -replace '.*?', ('{0}' -f [System.Security.SecurityElement]::Escape($repoRoot)) $tempXml = Join-Path $env:TEMP ("bakrest-task-{0}.xml" -f ([Guid]::NewGuid())) [System.IO.File]::WriteAllText($tempXml, $xml, [System.Text.Encoding]::Unicode) try { schtasks.exe /Create /TN $taskName /XML $tempXml /F if ($LASTEXITCODE -ne 0) { throw "schtasks failed with exit code $LASTEXITCODE" } Write-Host "Registered task: $taskName" Write-Host "Python: $pythonExe" Write-Host "WorkingDirectory: $repoRoot" } finally { Remove-Item -LiteralPath $tempXml -Force -ErrorAction SilentlyContinue }