@@ -23,28 +23,111 @@ Returns a simplified list of tasks for the local system that are not set to run
2323# Exclude tasks that are set to run interactively, include only tasks with credentials set.
2424[switch ] $NonInteractive
2525)
26- $ScheduledTask = @ {}
27- if ($TaskName ) {$ScheduledTask [' TaskName' ] = $TaskName }
28- if ($TaskPath ) {$ScheduledTask [' TaskPath' ] = $TaskPath }
29- $tasks = Get-ScheduledTask @ScheduledTask
30- if ($NonInteractive ) {$tasks = $tasks | Where-Object {$_.Principal.LogonType -eq 1 }}
31- foreach ($task in $tasks )
26+ Begin
3227{
33- $info = Get-ScheduledTaskInfo - TaskName $task.TaskName
34- [pscustomobject ]@ {
35- TaskName = $task.TaskName
36- Enabled = $task.Triggers -and $task.Triggers.Enabled -and `
37- $task.Settings -and $task.Settings.Enabled
38- User = $task.Principal.UserId
39- LastRunTime = $info.LastRunTime
40- ListTaskResult = $info.LastTaskResult
41- Run = ' {0}> {1} {2}' -f (($task.Actions.WorkingDirectory ?? " %SystemRoot%\system32" ),
42- ($task.Actions.Execute -replace ' \A([^"].*\s.*)\z' , ' "$1"' ),
43- $task.Actions.Arguments | ForEach-Object {[Environment ]::ExpandEnvironmentVariables($_ )})
44- Schedule = switch ($task .{Triggers}? .{CimClass}? .CimClassName)
28+ filter Get-Enabled
29+ {
30+ [CmdletBinding ()] Param (
31+ [Parameter (ValueFromPipelineByPropertyName = $true )][Microsoft.Management.Infrastructure.CimInstance ] $Settings ,
32+ [Parameter (ValueFromPipelineByPropertyName = $true )][Microsoft.Management.Infrastructure.CimInstance []] $Triggers
33+ )
34+ if ($Settings -and ! $Settings.Enabled ) {return $false }
35+ if (! $Triggers ) {return $false }
36+ foreach ($trigger in $Triggers ) {if (! $trigger.Enabled ) {return $false }}
37+ return $true
38+ }
39+ filter Get-Run
40+ {
41+ [CmdletBinding ()] Param (
42+ [Parameter (ValueFromPipeline = $true )][Microsoft.Management.Infrastructure.CimInstance ] $Action
43+ )
44+ return ' {0}> {1} {2}' -f (($Action.WorkingDirectory ?? " %SystemRoot%\system32" ),
45+ ($Action.Execute -replace ' \A([^"].*\s.*)\z' , ' "$1"' ),
46+ $Action.Arguments | ForEach-Object {[Environment ]::ExpandEnvironmentVariables($_ )})
47+ }
48+ function Get-Weekdays
49+ {
50+ [CmdletBinding ()] Param (
51+ [Parameter (Position = 0 )][ushort ] $DaysOfWeek
52+ )
53+ if ($DaysOfWeek -band 0b1 ) {[dayofweek ]::Sunday}
54+ if ($DaysOfWeek -band 0b10 ) {[dayofweek ]::Monday}
55+ if ($DaysOfWeek -band 0b100 ) {[dayofweek ]::Tuesday}
56+ if ($DaysOfWeek -band 0b1000 ) {[dayofweek ]::Wednesday}
57+ if ($DaysOfWeek -band 0b10000 ) {[dayofweek ]::Thursday}
58+ if ($DaysOfWeek -band 0b100000 ) {[dayofweek ]::Friday}
59+ if ($DaysOfWeek -band 0b1000000 ) {[dayofweek ]::Saturday}
60+ }
61+ filter Get-StateChange
62+ {
63+ [CmdletBinding ()] Param (
64+ [Parameter (ValueFromPipelineByPropertyName = $true )][string ] $UserId ,
65+ [Parameter (ValueFromPipelineByPropertyName = $true )][uint ] $StateChange
66+ )
67+ $username = " $ ( $UserId ? $UserId : ' any user' ) "
68+ switch ($StateChange )
69+ {
70+ 3 {" On remote connection to user session of $username " }
71+ 4 {" On remote disconnect from user session of $username " }
72+ 7 {" On workstation lock of $username " }
73+ 8 {" On workstation unlock of $username " }
74+ default {" On state change #$_ of $username " }
75+ }
76+ }
77+ filter Get-Schedule
78+ {
79+ [CmdletBinding ()] Param (
80+ [Parameter (ValueFromPipeline = $true )][Microsoft.Management.Infrastructure.CimInstance ] $Trigger
81+ )
82+ if (! $Trigger ) {return }
83+ switch ($Trigger.CimClass.CimClassName )
4584 {
46- MSFT_TaskTimeTrigger {' R/{0:yyyy-MM-ddTHH:mm:ss}/{1}' -f $task.Triggers.StartBoundary , $task.Triggers.Repetition.Interval }
47- default {$_ }
85+ MSFT_TaskTimeTrigger
86+ {
87+ if (! $Trigger.Repetition.Interval ) {$Trigger.StartBoundary }
88+ else {' R/{0:yyyy-MM-ddTHH:mm:ss}/{1}' -f $Trigger.StartBoundary , $Trigger.Repetition.Interval }
89+ }
90+ MSFT_TaskWeeklyTrigger
91+ {
92+ $start = Get-Date $Trigger.StartBoundary
93+ foreach ($day in Get-Weekdays $Trigger.DaysOfWeek )
94+ {
95+ ' R/{0:yyyy-MM-ddTHH:mm:ss}/P{1}W' -f `
96+ $start.AddDays (($start.DayOfWeek - $day ) + ($start.DayOfWeek -ge $day ? 0 : 7 )),
97+ $Trigger.WeeksInterval
98+ }
99+ }
100+ MSFT_TaskLogonTrigger {" At log on of $ ( $Trigger.UserId ?? ' any user' ) " }
101+ MSFT_TaskBootTrigger {' At startup' }
102+ MSFT_TaskIdleTrigger {' On idle' }
103+ MSFT_TaskTrigger {' At task creation/modification' }
104+ MSFT_TaskSessionStateChangeTrigger {$Trigger | Get-Member - Type Properties | Write-Debug ; $Trigger | Get-StateChange }
105+ default {$Trigger | Get-Member - Type Properties | Write-Debug ; $_ }
106+ }
107+ }
108+ filter Get-SimpleTask
109+ {
110+ [CmdletBinding ()] Param (
111+ [Parameter (ValueFromPipeline = $true )][Microsoft.Management.Infrastructure.CimInstance ] $Task
112+ )
113+ $info = Get-ScheduledTaskInfo - TaskName $Task.TaskName
114+ return [pscustomobject ]@ {
115+ TaskName = $Task.TaskName
116+ Enabled = $Task | Get-Enabled
117+ User = $Task.Principal.UserId
118+ LastRunTime = $info.LastRunTime
119+ LastTaskResult = $info.LastTaskResult
120+ Run = $Task.Actions | Get-Run
121+ Schedule = $Task.Triggers | Get-Schedule
48122 }
49123 }
50124}
125+ Process
126+ {
127+ $ScheduledTask = @ {}
128+ if ($TaskName ) {$ScheduledTask [' TaskName' ] = $TaskName }
129+ if ($TaskPath ) {$ScheduledTask [' TaskPath' ] = $TaskPath }
130+ $tasks = Get-ScheduledTask @ScheduledTask
131+ if ($NonInteractive ) {$tasks = $tasks | Where-Object {$_.Principal.LogonType -eq 1 }}
132+ $tasks | Get-SimpleTask
133+ }
0 commit comments