Prof. Powershell

Managing Scheduled Tasks, Part 3

Let's take one more look at the fun involved in managing tasks on an enterprise level.

Let's wrap up our look at managing scheduled tasks in PowerShell and Windows 8 (or Windows Server 2012) by managing the task we created last time:

PS C:\> get-scheduledtask MSInfoReport

There's more to this than meets the eye. Figure 1 shows the complete object.

The first thing I want to do is modify the task a bit and add some new information. The easiest approach I think is to get the task, modify it and then reset it.

PS C:\> $task=get-scheduledtask MSInfoReport
PS C:\> $task.Description="My sample scheduled task"
PS C:\> $task.Author="$env:userdomain\$env:username"

Scheduled Task object

Figure 1. A Scheduled Task object. (Click image to view larger version.)

I also want to modify some of the current settings:

PS C:\> $task.settings

AllowDemandStart                : True
AllowHardTerminate              : True
Compatibility                   : Vista
DeleteExpiredTaskAfter          :
DisallowStartIfOnBatteries      : True
Enabled                         : True
ExecutionTimeLimit              : PT72H
Hidden                          : False
IdleSettings                    : MSFT_TaskIdleSettings
MultipleInstances               : IgnoreNew
NetworkSettings                 : MSFT_TaskNetworkSettings
Priority                        : 7
RestartCount                    : 0
RestartInterval                 :
RunOnlyIfIdle                   : False
RunOnlyIfNetworkAvailable       : False
StartWhenAvailable              : False
StopIfGoingOnBatteries          : True
WakeToRun                       : False
DisallowStartOnRemoteAppSession : False
UseUnifiedSchedulingEngine      : False
MaintenanceSettings             :
volatile                        : False
PSComputerName                  :

There are cmdlets I could use to modify this object, but it is just as easy to set new values:

PS C:\> $task.settings.Compatibility="Win8"
PS C:\> $task.settings.RunOnlyIfNetworkAvailable=$True

All that is left at this point is to apply the changes by setting the task.

PS C:\> $task | Set-ScheduledTask -User "win8cp\administrator" -Password "P@ssw0rd"

When setting the task, you have to include the username and password. After refreshing the Task Scheduler management console, I can see my changes (see Fig. 2).

Revised Task

Figure 2. The Revised Task. (Click image to view larger version.)

Now, suppose I don't want to wait and want to run it now? Easy as this:

PS C:\> Start-ScheduledTask MSInfoReport

I can then check the results using the Get-ScheduledTaskInfo cmdlet which returns an Info object:

PS C:\> Get-ScheduledTaskInfo MSInfoReport

LastRunTime        : 5/23/2012 10:53:53 AM
LastTaskResult     : 0
NextRunTime        : 5/23/2012 12:00:00 PM
NumberOfMissedRuns : 0
TaskName           : MSInfoReport
TaskPath           :
PSComputerName     :

With this kind of information I can easily create a report showing what my tasks have been doing:

Get-ScheduledTask | Where {$_.state -eq "Ready"} | Select TaskName,
@{Name="LastRun";Expression={(Get-ScheduledTaskInfo -Input $_).LastRunTime}},
@{Name="Result";Expression={(Get-ScheduledTaskInfo -Input $_).LastTaskResult}} |
Sort Result,LastRun

Figure 3 displays my results.

Scheduled Tasks Results Report

Figure 3. Scheduled Tasks Results Report. (Click image to view larger version.)

A result of 0 should indicate success. Anything else I would need to investigate. There are many reporting ideas of I have but let's get back to the task at hand, so to speak.

Let's say I want to disable the scheduled task. I can get the task's settings object as I did earlier, modify it and reset. Or I can do it all in a one-line expression:

PS C:\> Get-ScheduledTask MSInfoReport | foreach {$_.Settings.Enabled=$False; $_} |
>> Set-ScheduledTask -user "win8cp\administrator" -Password "P@ssw0rd"

TaskPath             TaskName           State
--------             --------           -----
\                    MSInfoReport       Disabled

Finally, I want to delete the task. This is merely a matter of unregistering it:

PS C:\> Unregister-ScheduledTask MSInfoReport

Are you sure you want to perform this action?
Performing operation '\MSInfoReport' on Target 'Delete'.
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):
The cmdlet supports -WhatIf.

As we move further into the Windows 8 and Windows Server 2012 world, I think you'll find managing scheduled tasks in the enterprise will be much easier and maybe even a little fun.

About the Author

Jeffery Hicks is an IT veteran with over 25 years of experience, much of it spent as an IT infrastructure consultant specializing in Microsoft server technologies with an emphasis in automation and efficiency. He is a multi-year recipient of the Microsoft MVP Award in Windows PowerShell. He works today as an independent author, trainer and consultant. Jeff has written for numerous online sites and print publications, is a contributing editor at, and a frequent speaker at technology conferences and user groups.

comments powered by Disqus
Most   Popular