Share via


About Scheduled Jobs Basics

Short description

Explains how to create and manage scheduled jobs.

Long description

This document shows how to perform basic tasks of creating and managing scheduled jobs. For information about more advanced tasks, see about_Scheduled_Jobs_Advanced.

How to create a scheduled job

To create a scheduled job, use the Register-ScheduledJob cmdlet. The cmdlet requires a name and the commands or script that the job runs. You can either run the job immediately by adding the RunNow parameter, or create a job trigger and set job options when you create the job, or edit an existing job.

To create a job that runs a script, use the FilePath parameter to specify the path to the script file. To create a job that runs commands, use the ScriptBlock parameter.

The Register-ScheduledJob cmdlet creates the ProcessJob, which runs a Get-Process command. This scheduled job has the default job options and no job trigger.

Register-ScheduledJob -Name ProcessJob -ScriptBlock { Get-Process }
Id         Name            Triggers        Command       Enabled
--         ----            --------        -------       -------
8          ProcessJob      {}              Get-Process   True

How to create a job trigger

Job triggers start a scheduled job automatically. A job trigger can be one-time or recurring schedule or an event, such as when a user logs on or Windows starts. Each job can have zero, one, or multiple job triggers.

To create a job trigger, use the New-JobTrigger cmdlet. The following command creates a job trigger that starts a job every Monday and Thursday at 5:00 AM. The command saves the job trigger in the $T variable.

$T = New-JobTrigger -Weekly -DaysOfWeek "Monday", "Thursday" -At "5:00 AM"

Job triggers are optional. You can start a scheduled job at any time by adding the RunNow parameter to your Register-ScheduledJob command, or by using the Start-Job cmdlets.

How to add a job trigger

When you add a job trigger to a scheduled job, the job trigger is added to the scheduled job XML file for the scheduled job and becomes part of the scheduled job.

You can add a job trigger to a scheduled job when you create the scheduled job, or edit an existing job. You can change the job trigger of a scheduled job at any time.

PowerShell uses some of the same job triggers that Task Scheduler uses. For detailed information about job triggers, see the help topic for the New-JobTrigger cmdlet.

The following example uses splatting to create $JobParms which are parameter values that are passed to the Register-ScheduledJob cmdlet. For more information, see about_Splatting.md. The Register-ScheduledJob uses @JobParms to create a scheduled job. It uses the Trigger parameter to specify the job trigger in the $T variable.

$JobParms = @{
  Name = "ProcessJob"
  ScriptBlock = {Get-Command}
  Trigger = $T
}

Register-ScheduledJob @JobParms

You can also add a job trigger to an existing scheduled job at any time. The Add-JobTrigger cmdlet adds the job trigger in the $T variable to the ProcessJob scheduled job.

Add-JobTrigger -Name ProcessJob -Trigger $T

As a result, the job trigger starts the ProcessJob automatically every Monday and Thursday at 5:00 AM.

How to get a job trigger

To get the job trigger of a scheduled job, use the Get-JobTrigger cmdlet. Use the Name, ID, and InputObject parameters to specify the scheduled job, not the job trigger.

Get-JobTrigger gets the job trigger of the ProcessJob.

Get-JobTrigger -Name ProcessJob
Id   Frequency       Time                   DaysOfWeek              Enabled
--   ---------       ----                   ----------              -------
1    Weekly          11/7/2011 5:00:00 AM   {Monday, Thursday}      True

How to create job options

Job options establish conditions for starting and running the job. Every job has the default job options unless you change them. Because job options can prevent a job from running at the scheduled time, it is important to understand the job options and use them carefully.

PowerShell uses the same job options that Task Scheduler uses. For detailed information about the job options, see the help topic for New-ScheduledJobOption.

Job options are stored in the scheduled job XML file. You can set job options when you create a scheduled job or change them at any time.

The New-ScheduledJobOption cmdlet creates a scheduled job option in which the WakeToRun scheduled job option is set to True. The WakeToRun option runs the scheduled job even if the computer is in the Sleep or Hibernate state at the scheduled start time. The command saves the job options in the $O variable.

$O = New-ScheduledJobOption -WakeToRun

How to get job options

To get the job options of a scheduled job, use the Get-ScheduledJobOption cmdlet. Use the Name, ID, and InputObject parameters to specify the scheduled job, not the job options.

Get-ScheduledJobOption gets the job options of the ProcessJob.

Get-ScheduledJobOption -Name ProcessJob
StartIfOnBatteries     : False
StopIfGoingOnBatteries : True
WakeToRun              : False
StartIfNotIdle         : True
StopIfGoingOffIdle     : False
RestartOnIdleResume    : False
IdleDuration           : 00:10:00
IdleTimeout            : 01:00:00
ShowInTaskScheduler    : True
RunElevated            : False
RunWithoutNetwork      : True
DoNotAllowDemandStart  : False
MultipleInstancePolicy : IgnoreNew
JobDefinition          : Microsoft.PowerShell.ScheduledJob.ScheduledJobDefinition

How to change job options

You can change the job options of a scheduled job when you create a scheduled job or edit an existing job.

The splatted $JobParms are passed to the Add-JobTrigger cmdlet to create the process job. It uses the ScheduledJobOption parameter to specify the job options in the $O variable.

$JobParms = @{
  Name = "ProcessJob"
  ScriptBlock = {Get-Process}
  ScheduledJobOption = $O
}

Add-JobTrigger @JobParms

You can also change the job options to an existing scheduled job at any time. The following command uses the Set-ScheduledJobOption cmdlet to change the value of the WakeToRun option of the ProcessJob scheduledJob to True.

The Set cmdlets in the PSScheduledJob module, such as the Set-ScheduledJobOption cmdlet, don't have Name or ID parameters. You can use the InputObject parameter to specify the scheduled job options or pipe a scheduled job from Get-ScheduledJobOption cmdlet to Set-ScheduledJobOption.

This example uses the Get-ScheduledJob cmdlet to get the ProcessJob. It uses the Get-ScheduledJobOption cmdlet to get the job options in the ProcessJob and the Set-ScheduledJobOption cmdlet to change the WakeToRun job option in the ProcessJob to True.

Get-ScheduledJob -Name ProcessJob | Get-ScheduledJobOption |
 Set-ScheduledJobOption -WakeToRun

How to get scheduled job instances

When a scheduled job is started, PowerShell creates a job instance that is similar to a standard PowerShell background job. You can use the job cmdlets, such as Get-Job, Stop-Job and Receive-Job to manage the job instances.

Note

To use the job cmdlets on instances of scheduled jobs, the PSScheduledJob module must be imported into the session. To import the PSScheduledJob module, type Import-Module PSScheduledJob or use any scheduled job cmdlet, such as Get-ScheduledJob.

To get all instances of PowerShell scheduled jobs, and all active standard jobs, use the Get-Job cmdlet. The Import-Module cmdlet imports the PSScheduledJob module and Get-Job gets the jobs on the local computer.

Import-Module PSScheduledJob
Get-Job

Get-Job gets instances of ProcessJob on the local computer.

Get-Job -Name ProcessJob
Id     Name        PSJobTypeName  State    HasMoreData   Location   Command
--     ----        ------------   -----    -----------   --------   -------
45     ProcessJob  PSScheduledJob Completed       True   localhost   Get-Process
46     ProcessJob  PSScheduledJob Completed       True   localhost   Get-Process
47     ProcessJob  PSScheduledJob Completed       True   localhost   Get-Process
48     ProcessJob  PSScheduledJob Completed       True   localhost   Get-Process
49     ProcessJob  PSScheduledJob Completed       True   localhost   Get-Process
50     ProcessJob  PSScheduledJob Completed       True   localhost   Get-Process
51     ProcessJob  PSScheduledJob Completed       True   localhost   Get-Process

The default display does not show the start time, which typically distinguishes instances of the same scheduled job.

The Get-Job cmdlet sends objects down the pipeline. The Format-Table cmdlet displays the Name, ID, and BeginTime properties of the scheduled job.

Get-Job ProcessJob | Format-Table -Property Name, ID, BeginTime
Name       Id BeginTime
----       -- ---------
ProcessJob 43 11/2/2011 3:00:02 AM
ProcessJob 44 11/3/2011 3:00:02 AM
ProcessJob 45 11/4/2011 3:00:02 AM
ProcessJob 46 11/5/2011 3:00:02 AM
ProcessJob 47 11/6/2011 3:00:02 AM
ProcessJob 48 11/7/2011 12:00:01 AM
ProcessJob 49 11/7/2011 3:00:02 AM
ProcessJob 50 11/8/2011 3:00:02 AM

Get scheduled job results

To get the results of an instance of a scheduled job, use the Receive-Job cmdlet.

Note

To use the Job cmdlets on instances of scheduled jobs, the PSScheduledJob module must be imported into the session. To import the PSScheduledJob module, type Import-Module PSScheduledJob or use any scheduled job cmdlet, such as Get-ScheduledJob.

This examples gets the results of the newest instance of the ProcessJob scheduled job (ID = 51).

Import-Module PSScheduledJob
Receive-Job -ID 51 -Keep

The results of scheduled jobs are saved on disk, so the Keep parameter of Receive-Job is not required. However, without the Keep parameter, you can get the results of a scheduled job only once in each PowerShell session. To start a new PowerShell session, type PowerShell or open a new PowerShell window.

See also

about_Scheduled_Jobs_Advanced

about_Scheduled_Jobs_Troubleshooting

about_Scheduled_Jobs

about_Splatting.md

Task Scheduler