public/Invoke-OctaTaskBrowser.ps1
|
function Invoke-OctaTaskBrowser { <# .SYNOPSIS Lists scheduled tasks and can enable/disable/run/stop/delete one by TaskPath\TaskName. FR-044. Enable/disable reuse the same snapshot + Run Record mechanism as Invoke-OctaStartupManager - Undo-OctaRun needs no changes. #> [CmdletBinding()] param( [string]$Enable, [string]$Disable, [string]$Run, [string]$Stop, [string]$Delete, [switch]$Yes ) function Split-OctaTaskFullName { param([string]$FullName) $lastSlash = $FullName.LastIndexOf('\') return @{ TaskPath = $FullName.Substring(0, $lastSlash + 1) TaskName = $FullName.Substring($lastSlash + 1) } } if (-not ($Enable -or $Disable -or $Run -or $Stop -or $Delete)) { $tasks = @(Get-ScheduledTask -ErrorAction SilentlyContinue) foreach ($t in $tasks) { Write-Host ("{0,-10} {1}{2}" -f $t.State, $t.TaskPath, $t.TaskName) } return $tasks } if ($Enable -or $Disable) { $fullName = if ($Enable) { $Enable } else { $Disable } $parts = Split-OctaTaskFullName -FullName $fullName $run = New-OctaRunFolder $snapshot = Save-OctaActionSnapshot -Action (New-OctaAction -TargetType ScheduledTask -TargetIdentifier "$($parts.TaskPath)|$($parts.TaskName)" -CurrentValue 'n/a' -PlannedValue 'n/a') -RunFolder $run.Path if ($Enable) { Enable-ScheduledTask -TaskPath $parts.TaskPath -TaskName $parts.TaskName | Out-Null } else { Disable-ScheduledTask -TaskPath $parts.TaskPath -TaskName $parts.TaskName | Out-Null } Save-OctaRunRecord -RunFolder $run.Path -RunRecord ([pscustomobject]@{ RunId = $run.RunId Timestamp = (Get-Date).ToString('o') CategoriesApplied = @('task-browser') RestorePointStatus = 'SkippedByUser' RestorePointSequenceNumber = $null ActionSnapshots = @($snapshot) IrreversibleActionRefs = @() Status = 'Completed' }) return [pscustomobject]@{ Status = 'Success'; RunId = $run.RunId } } if ($Run) { $parts = Split-OctaTaskFullName -FullName $Run Start-ScheduledTask -TaskPath $parts.TaskPath -TaskName $parts.TaskName return [pscustomobject]@{ Status = 'Success'; Message = "Started $Run" } } if ($Stop) { $parts = Split-OctaTaskFullName -FullName $Stop Stop-ScheduledTask -TaskPath $parts.TaskPath -TaskName $parts.TaskName return [pscustomobject]@{ Status = 'Success'; Message = "Stopped $Stop" } } if ($Delete) { Write-Host "Deleting a scheduled task is irreversible (no snapshot can re-create its definition)." if (-not $Yes) { $response = Read-Host "Delete $Delete ? (y/N)" if ($response -notin @('y', 'Y', 's', 'S')) { return [pscustomobject]@{ Status = 'Cancelled' } } } $parts = Split-OctaTaskFullName -FullName $Delete Unregister-ScheduledTask -TaskPath $parts.TaskPath -TaskName $parts.TaskName -Confirm:$false return [pscustomobject]@{ Status = 'Success'; Message = "Deleted $Delete" } } } |