Files
soft/tools/runScreenshotTask.ps1
T
2026-08-25 14:55:38 +03:00

76 lines
2.4 KiB
PowerShell

param(
[Parameter(Mandatory = $true)]
[string]$Executable,
[Parameter(Mandatory = $true)]
[string]$Name,
[string]$OutputDirectory = "C:\codex\screenshots",
[string]$Arguments = "",
[string]$WorkingDirectory = "",
[string]$InitialKeys = "",
[string]$ScreenshotTool = "",
[ValidateRange(1, 60)]
[int]$WaitSeconds = 8
)
$ErrorActionPreference = "Stop"
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
$taskName = "CodexScreenshot"
$screenshotScript = Join-Path $PSScriptRoot "screenshotApp.ps1"
$resultPath = Join-Path $OutputDirectory "$Name.json"
New-Item -ItemType Directory -Force -Path $OutputDirectory | Out-Null
Remove-Item -Force -ErrorAction SilentlyContinue $resultPath, (Join-Path $OutputDirectory "$Name.png")
$taskArguments = @(
"-NoProfile"
"-ExecutionPolicy Bypass"
"-File `"$screenshotScript`""
"-Executable `"$Executable`""
"-Name `"$Name`""
"-OutputDirectory `"$OutputDirectory`""
"-WaitSeconds $WaitSeconds"
)
if ($Arguments.Length -gt 0) {
$escapedArguments = $Arguments.Replace('"', '\"')
$taskArguments += "-Arguments `"$escapedArguments`""
}
if ($WorkingDirectory.Length -gt 0) {
$taskArguments += "-WorkingDirectory `"$WorkingDirectory`""
}
if ($InitialKeys.Length -gt 0) {
$taskArguments += "-InitialKeys `"$InitialKeys`""
}
if ($ScreenshotTool.Length -gt 0) {
$taskArguments += "-ScreenshotTool `"$ScreenshotTool`""
}
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument ($taskArguments -join " ")
$principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -LogonType Interactive -RunLevel Highest
$settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 2) -AllowStartIfOnBatteries
Register-ScheduledTask -TaskName $taskName -Action $action -Principal $principal -Settings $settings -Force | Out-Null
try {
Start-ScheduledTask -TaskName $taskName
$deadline = (Get-Date).AddSeconds($WaitSeconds + 30)
while (-not (Test-Path $resultPath) -and (Get-Date) -lt $deadline) {
Start-Sleep -Milliseconds 500
}
if (-not (Test-Path $resultPath)) {
throw "Screenshot task timed out."
}
Get-Content -Raw -Encoding UTF8 $resultPath
}
finally {
Stop-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
Unregister-ScheduledTask -TaskName $taskName -Confirm:$false -ErrorAction SilentlyContinue
}