@@ -46,8 +46,14 @@ function Add-CIPPScheduledTask {
4646 return " Could not run task: $ErrorMessage "
4747 }
4848 } else {
49+ if (! $Task.RowKey ) {
50+ $RowKey = (New-Guid ).Guid
51+ } else {
52+ $RowKey = $Task.RowKey
53+ }
54+
4955 if ($DisallowDuplicateName ) {
50- $Filter = " PartitionKey eq 'ScheduledTask' and Name eq '$ ( $Task.Name ) '"
56+ $Filter = " PartitionKey eq 'ScheduledTask' and Name eq '$ ( $Task.Name ) ' and TaskState ne 'Completed' and TaskState ne 'Failed' "
5157 $ExistingTask = (Get-CIPPAzDataTableEntity @Table - Filter $Filter )
5258 if ($ExistingTask ) {
5359 return " Task with name $ ( $Task.Name ) already exists"
@@ -110,11 +116,7 @@ function Add-CIPPScheduledTask {
110116 }
111117 $AdditionalProperties = ([PSCustomObject ]$AdditionalProperties | ConvertTo-Json - Compress)
112118 if ($Parameters -eq ' null' ) { $Parameters = ' ' }
113- if (! $Task.RowKey ) {
114- $RowKey = (New-Guid ).Guid
115- } else {
116- $RowKey = $Task.RowKey
117- }
119+
118120
119121 $Recurrence = if ([string ]::IsNullOrEmpty($task.Recurrence.value )) {
120122 $task.Recurrence
@@ -258,7 +260,46 @@ function Add-CIPPScheduledTask {
258260 return " Error - Could not add task: $ErrorMessage "
259261 }
260262 Write-LogMessage - headers $Headers - API ' ScheduledTask' - message " Added task $ ( $entity.Name ) with ID $ ( $entity.RowKey ) " - Sev ' Info' - Tenant $tenantFilter
261- return " Successfully added task: $ ( $entity.Name ) "
263+
264+ # Calculate relative time for next run
265+ $scheduledEpoch = [int64 ]$entity.ScheduledTime
266+ $currentTime = [datetime ]::UtcNow
267+
268+ if ($scheduledEpoch -eq 0 -or $scheduledEpoch -le ([int64 ](($currentTime ) - (Get-Date ' 1/1/1970' )).TotalSeconds)) {
269+ # Task will run at next 15-minute interval - calculate efficiently
270+ $minutesToAdd = 15 - ($currentTime.Minute % 15 )
271+ $nextRunTime = $currentTime.AddMinutes ($minutesToAdd ).AddSeconds(- $currentTime.Second ).AddMilliseconds(- $currentTime.Millisecond )
272+ $timeUntilRun = $nextRunTime - $currentTime
273+ } else {
274+ # Task is scheduled for a specific time in the future
275+ $scheduledTime = [datetime ]' 1/1/1970' + [TimeSpan ]::FromSeconds($scheduledEpoch )
276+ $timeUntilRun = $scheduledTime - $currentTime
277+ }
278+
279+ # Format relative time
280+ $relativeTime = switch ($timeUntilRun.TotalMinutes ) {
281+ { $_ -ge 1440 } {
282+ $days = [Math ]::Floor($timeUntilRun.TotalDays )
283+ $hours = $timeUntilRun.Hours
284+ $result = " $days day$ ( if ($days -ne 1 ) { ' s' }) "
285+ if ($hours -gt 0 ) { $result += " and $hours hour$ ( if ($hours -ne 1 ) { ' s' }) " }
286+ $result
287+ break
288+ }
289+ { $_ -ge 60 } {
290+ $hours = [Math ]::Floor($timeUntilRun.TotalHours )
291+ $minutes = $timeUntilRun.Minutes
292+ $result = " $hours hour$ ( if ($hours -ne 1 ) { ' s' }) "
293+ if ($minutes -gt 0 ) { $result += " and $minutes minute$ ( if ($minutes -ne 1 ) { ' s' }) " }
294+ $result
295+ break
296+ }
297+ { $_ -ge 2 } { " about $ ( [Math ]::Round($_ )) minutes" ; break }
298+ { $_ -ge 1 } { ' about 1 minute' ; break }
299+ default { ' less than a minute' }
300+ }
301+
302+ return " Successfully added task: $ ( $entity.Name ) . It will run in $relativeTime ."
262303 }
263304 } catch {
264305 Write-Warning " Failed to add scheduled task: $ ( $_.Exception.Message ) "
0 commit comments