playwright/manage-task-new.ps1
2025-03-25 17:19:52 +08:00

314 lines
10 KiB
PowerShell
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 设置控制台编码
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
[Console]::InputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
# 获取当前目录的完整路径
$currentPath = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition
$scriptPath = Join-Path $currentPath "run-tests.bat"
$currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
# Task Configuration
$taskNamePrefix = "Playwright_AutoTest"
$taskDesc = "Run Playwright tests daily"
function Show-Menu {
Clear-Host
Write-Host "`n================== Playwright Test Manager ==================`n"
Write-Host "1. View All Tasks Status"
Write-Host "2. Set Daily Task - DEV Environment (Default: 23:00)"
Write-Host "3. Set Daily Task - UAT Environment"
Write-Host "4. Set Daily Task - PROD Environment"
Write-Host "5. Run Test Now"
Write-Host "6. Delete Tasks"
Write-Host "Q. Exit"
Write-Host "`nEnter your choice (1-6, or Q to exit): " -NoNewline
}
function Get-TaskStatus {
$environments = @("Dev", "UAT", "PROD")
$found = $false
Write-Host "`nTasks Status:"
foreach ($env in $environments) {
$taskName = "${taskNamePrefix}_$env"
$task = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
if ($task) {
$found = $true
Write-Host "`n$env Environment Task:"
Write-Host "Name: $taskName"
Write-Host "State: $($task.State)"
# 获取更详细的任务信息
$taskInfo = Get-ScheduledTaskInfo -TaskName $taskName -ErrorAction SilentlyContinue
$trigger = $task.Triggers[0]
if ($trigger) {
Write-Host "Schedule: Daily at $($trigger.StartBoundary.Split('T')[1].Substring(0,5))"
if ($taskInfo -and $taskInfo.NextRunTime) {
Write-Host "Next Run: $($taskInfo.NextRunTime.ToString('yyyy-MM-dd HH:mm'))"
} else {
Write-Host "Next Run: Task needs to be enabled"
}
}
Write-Host "Last Result: $($task.LastTaskResult)"
Write-Host "Working Directory: $($task.Actions[0].WorkingDirectory)"
Write-Host "Run As User: $($task.Principal.UserId)"
}
}
if (-not $found) {
Write-Host "`nNo tasks found. Please set up tasks using options 2, 3 or 4."
}
Pause-Script
}
function Set-DailyTask {
param (
[string]$runTime = "23:00",
[string]$environment
)
$taskName = "${taskNamePrefix}_$environment"
Write-Host "`nSetting up daily task for $environment environment..."
$scriptPath = Join-Path $PSScriptRoot "run-tests.bat"
if (-not (Test-Path $scriptPath)) {
Write-Host "`nError: Test script not found at: $scriptPath"
Write-Host "Path: $scriptPath"
Pause-Script
return
}
# 确保时间格式正确
if ($runTime -notmatch "^([01]?[0-9]|2[0-3]):[0-5][0-9]$") {
Write-Host "`nError: Invalid time format. Please use HH:mm format (e.g., 23:00)"
Pause-Script
return
}
try {
# 创建任务操作 - 添加环境参数
$envArg = $environment.ToLower()
$action = New-ScheduledTaskAction -Execute $scriptPath -WorkingDirectory $PSScriptRoot -Argument $envArg
if (-not $action) {
throw "Failed to create task action"
}
# 创建任务触发器
$trigger = New-ScheduledTaskTrigger -Daily -At $runTime
if (-not $trigger) {
throw "Failed to create task trigger"
}
# 创建任务设置
$settings = New-ScheduledTaskSettingsSet `
-RestartCount 3 `
-RestartInterval (New-TimeSpan -Minutes 5) `
-StartWhenAvailable `
-DontStopOnIdleEnd `
-ExecutionTimeLimit (New-TimeSpan -Hours 2)
if (-not $settings) {
throw "Failed to create task settings"
}
# 创建任务主体
$principal = New-ScheduledTaskPrincipal -UserId $currentUser -RunLevel Highest
if (-not $principal) {
throw "Failed to create task principal"
}
$existingTask = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
if ($existingTask) {
# 更新现有任务
$result = Set-ScheduledTask -TaskName $taskName `
-Action $action `
-Trigger $trigger `
-Settings $settings `
-Principal $principal
if ($result) {
Write-Host "`nTask successfully updated!"
} else {
throw "Failed to update task"
}
} else {
# 创建新任务
$result = Register-ScheduledTask -TaskName $taskName `
-Description "$taskDesc ($environment Environment)" `
-Action $action `
-Trigger $trigger `
-Settings $settings `
-Principal $principal
if ($result) {
Write-Host "`nTask successfully created!"
} else {
throw "Failed to create task"
}
}
# 验证任务创建/更新是否成功
$updatedTask = Get-ScheduledTask -TaskName $taskName -ErrorAction Stop
if ($updatedTask) {
Write-Host "`nTask Details:"
Write-Host "Task Name: $taskName"
Write-Host "Environment: $environment"
Write-Host "Run Time: Daily at $runTime"
if ($updatedTask.NextRunTime) {
Write-Host "Next Run: $($updatedTask.NextRunTime.ToString('yyyy-MM-dd HH:mm'))"
} else {
Write-Host "Next Run: Not scheduled"
}
Write-Host "Status: $($updatedTask.State)"
Write-Host "Run As: $($updatedTask.Principal.UserId)"
} else {
Write-Host "`nWarning: Task was created but could not be verified."
}
} catch {
Write-Host "`nError setting up task: $_"
Write-Host "Please make sure you have administrative privileges."
Write-Host "Error details: $($_.Exception.Message)"
}
Pause-Script
}
function Update-TaskTime {
Write-Host "`nSelect environment:"
Write-Host "1. Development (dev)"
Write-Host "2. UAT"
Write-Host "`nEnter your choice (1-2): " -NoNewline
$envChoice = Read-Host
$environment = switch ($envChoice) {
"1" { "dev" }
"2" { "uat" }
default {
Write-Host "`nInvalid choice. Using default (dev)"
"dev"
}
}
Write-Host "`nEnter new time (HH:mm, e.g. 02:00): " -NoNewline
$newTime = Read-Host
if ($newTime -match "^([01]?[0-9]|2[0-3]):[0-5][0-9]$") {
Set-DailyTask -runTime $newTime -environment $environment
} else {
Write-Host "`nInvalid time format"
Pause-Script
}
}
function Start-TestNow {
Write-Host "`nSelect environment:"
Write-Host "1. Development (dev)"
Write-Host "2. UAT"
Write-Host "3. PROD"
Write-Host "`nEnter your choice (1-3): " -NoNewline
$envChoice = Read-Host
$env = switch ($envChoice) {
"1" { "dev" }
"2" { "uat" }
"3" { "prod" }
default {
Write-Host "`nInvalid choice. Using default (dev)"
"dev"
}
}
Write-Host "`nStarting test in $env environment..."
try {
$scriptPath = Join-Path $PSScriptRoot "run-tests.bat"
# 使用cmd直接运行这样可以看到实时输出
& cmd /c $scriptPath $env
Write-Host "`nTest completed"
} catch {
Write-Host "`nError: $_"
}
Pause-Script
}
function Remove-AutomationTask {
Write-Host "`nSelect tasks to delete:"
Write-Host "1. DEV Environment Task"
Write-Host "2. UAT Environment Task"
Write-Host "3. PROD Environment Task"
Write-Host "4. All Tasks"
Write-Host "`nEnter your choice (1-4): " -NoNewline
$choice = Read-Host
$tasksToDelete = switch ($choice) {
"1" { @("Dev") }
"2" { @("UAT") }
"3" { @("PROD") }
"4" { @("Dev", "UAT", "PROD") }
default {
Write-Host "`nInvalid choice."
Pause-Script
return
}
}
foreach ($env in $tasksToDelete) {
$taskName = "${taskNamePrefix}_$env"
$task = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
if ($task) {
try {
Unregister-ScheduledTask -TaskName $taskName -Confirm:$false
Write-Host "`nTask '$taskName' deleted"
} catch {
Write-Host "`nError deleting task '$taskName': $_"
}
} else {
Write-Host "`nTask '$taskName' not found"
}
}
Pause-Script
}
function Pause-Script {
Write-Host "`nPress Enter to continue..." -NoNewline
Read-Host
}
# Main Loop
do {
Show-Menu
$choice = Read-Host
switch ($choice.ToUpper()) {
"1" { Get-TaskStatus }
"2" { Set-DailyTask -environment "Dev" }
"3" {
Write-Host "`nEnter time for UAT task (HH:mm, e.g. 02:00): " -NoNewline
$uatTime = Read-Host
if ($uatTime -match "^([01]?[0-9]|2[0-3]):[0-5][0-9]$") {
Set-DailyTask -runTime $uatTime -environment "UAT"
} else {
Write-Host "`nInvalid time format"
Pause-Script
}
}
"4" {
Write-Host "`nEnter time for PROD task (HH:mm, e.g. 02:30): " -NoNewline
$prodTime = Read-Host
if ($prodTime -match "^([01]?[0-9]|2[0-3]):[0-5][0-9]$") {
Set-DailyTask -runTime $prodTime -environment "PROD"
} else {
Write-Host "`nInvalid time format"
Pause-Script
}
}
"5" { Start-TestNow }
"6" { Remove-AutomationTask }
"Q" { exit }
default {
Write-Host "`nInvalid choice. Please try again."
Pause-Script
}
}
} while ($true)