Private/Update-StmTaskTriggerXml.ps1
|
function Update-StmTaskTriggerXml { [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Justification = 'Private helper that modifies in-memory XML only; parent function handles ShouldProcess')] <# .SYNOPSIS Updates the Triggers section of a scheduled task XML document. .DESCRIPTION Clears existing triggers from a scheduled task XML document and replaces them with new triggers from the provided CIM trigger objects. This function modifies the XML document in place. Supports the following trigger types: - Daily (CalendarTrigger with ScheduleByDay) - Weekly (CalendarTrigger with ScheduleByWeek) - Once (TimeTrigger) - Logon (LogonTrigger) - Boot (BootTrigger) .PARAMETER TaskXml The XML document representing the scheduled task configuration. This document is modified in place. .PARAMETER Trigger An array of CIM trigger objects created by New-ScheduledTaskTrigger. Each trigger defines when the task should run. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [ValidateNotNull()] [xml] $TaskXml, [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [object[]] $Trigger ) process { $triggersNode = $TaskXml.Task.Triggers $ns = $TaskXml.DocumentElement.NamespaceURI # Clear existing triggers $triggersNode.RemoveAll() # Add new triggers based on type foreach ($trig in $Trigger) { $triggerElement = $null $triggerType = $trig.CimClass.CimClassName switch -Wildcard ($triggerType) { '*Daily*' { $triggerElement = $TaskXml.CreateElement('CalendarTrigger', $ns) $schedByDay = $TaskXml.CreateElement('ScheduleByDay', $ns) $daysInterval = $TaskXml.CreateElement('DaysInterval', $ns) $daysInterval.InnerText = if ($trig.DaysInterval) { $trig.DaysInterval } else { '1' } $schedByDay.AppendChild($daysInterval) | Out-Null $triggerElement.AppendChild($schedByDay) | Out-Null } '*Weekly*' { $triggerElement = $TaskXml.CreateElement('CalendarTrigger', $ns) $schedByWeek = $TaskXml.CreateElement('ScheduleByWeek', $ns) # Add WeeksInterval $weeksInterval = $TaskXml.CreateElement('WeeksInterval', $ns) $weeksInterval.InnerText = if ($trig.WeeksInterval) { $trig.WeeksInterval } else { '1' } $schedByWeek.AppendChild($weeksInterval) | Out-Null # Add DaysOfWeek - Windows Task Scheduler uses bit flags (Sunday=1, Monday=2, Tuesday=4, etc.) if ($trig.DaysOfWeek) { $daysOfWeek = $TaskXml.CreateElement('DaysOfWeek', $ns) $dayFlags = @{ Sunday = 1 Monday = 2 Tuesday = 4 Wednesday = 8 Thursday = 16 Friday = 32 Saturday = 64 } foreach ($dayName in $dayFlags.Keys) { if ($trig.DaysOfWeek -band $dayFlags[$dayName]) { $dayElement = $TaskXml.CreateElement($dayName, $ns) $daysOfWeek.AppendChild($dayElement) | Out-Null } } $schedByWeek.AppendChild($daysOfWeek) | Out-Null } $triggerElement.AppendChild($schedByWeek) | Out-Null } '*TimeTrigger*' { $triggerElement = $TaskXml.CreateElement('TimeTrigger', $ns) } '*Logon*' { $triggerElement = $TaskXml.CreateElement('LogonTrigger', $ns) } '*Boot*' { $triggerElement = $TaskXml.CreateElement('BootTrigger', $ns) } default { Write-Warning "Unknown trigger type '$triggerType'. Falling back to TimeTrigger." $triggerElement = $TaskXml.CreateElement('TimeTrigger', $ns) } } if ($triggerElement) { # Add start boundary if available if ($trig.StartBoundary) { $startBoundary = $TaskXml.CreateElement('StartBoundary', $ns) $startBoundary.InnerText = $trig.StartBoundary $triggerElement.PrependChild($startBoundary) | Out-Null } # Add enabled status $enabled = $TaskXml.CreateElement('Enabled', $ns) $enabled.InnerText = if ($trig.Enabled -eq $false) { 'false' } else { 'true' } $triggerElement.AppendChild($enabled) | Out-Null $triggersNode.AppendChild($triggerElement) | Out-Null } } } } |