Files
bak-and-rest/scripts/Register-BakRestTask.ps1

54 lines
1.9 KiB
PowerShell

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 '<Command>.*?</Command>', ('<Command>{0}</Command>' -f [System.Security.SecurityElement]::Escape($pythonExe))
$xml = $xml -replace '<WorkingDirectory>.*?</WorkingDirectory>', ('<WorkingDirectory>{0}</WorkingDirectory>' -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
}