Skip to content

Commit df28ec4

Browse files
committed
🐛 Get-SimpleSchTasks.ps1 not providing a recurrence Schedule value for some triggers
- resolves brianary#49
1 parent 57d397b commit df28ec4

File tree

1 file changed

+103
-20
lines changed

1 file changed

+103
-20
lines changed

Get-SimpleSchTasks.ps1

Lines changed: 103 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)