In last week’s PowerShell class, we had a question about not
only running a scheduled job, but how to unregister it after it finishes. Good question. The answer is actually very simple.
The code below is a very simple job. The problem with it is that after it
executes, it will stay in memory until you unregister it.
$Trigger = New-ScheduledTaskTrigger -Once
-At (Get-Date).AddMinutes(1)
Register-ScheduledJob -Trigger $Trigger
`
-Name
"Test1" `
-ScriptBlock
{Get-CimInstance -ClassName
Win32_Bios}
In the Task Scheduler, we can see that the job completed,
but it still in memory.
The cmdlet Unregister-ScheduledJob must be run to remove
this object from memory.
PS C:\> Unregister-ScheduledJob -Name Test1
Now we will re-code the script to automatically remove the
job after it completes.
$Trigger = New-ScheduledTaskTrigger -Once
-At (Get-Date).AddMinutes(1)
Register-ScheduledJob -Trigger $Trigger
`
-Name
"Test1" `
-ScriptBlock
{
Get-CimInstance -ClassName Win32_Bios
Unregister-ScheduledJob -Name "Test1"
}
Notice that the final cmdlet in the script block is
Unregister-ScheduledJob. This removal
will take effect immediately in the Task Scheduler once the job completes. If you are still in the same PowerShell
session as the one you used to create the job, you will see the following error
for a few minutes after the job is unregistered.
PS C:\> Get-ScheduledJob
Get-ScheduledJob : Cannot get the Test1 scheduled job because it is
corrupted or in an irresolvable state. Because it cannot run,
Windows PowerShell has deleted Test1 and its results from the
computer. To recreate the scheduled job, use the Register-ScheduledJob
cmdlet. For more information about corrupted scheduled jobs, see
about_Scheduled_Jobs_Troubleshooting.
At line:1 char:1
+ Get-ScheduledJob
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:)
[Get-ScheduledJob], RuntimeException
+ FullyQualifiedErrorId :
CantLoadScheduledJobDefinitionFromStore,Microsoft.PowerShell.ScheduledJob.GetScheduledJobCommand
Again this error will correct itself shortly.
This method is only appropriate if you do not intent on recovering
data from the script later on. One of
the benefits of a scheduled job is that the objects returned are serialized and
written to disk for you to consume later.
If you un-register the job, that stored data is removed from this. For this reason, you should ether explicitly
commit the objects to disk before the Unregister-Scheduled job cmdlet is executed
or only use this procedure for scripts that perform actions. In any case, I would consider a little extra
code to at least email you to let you know if the task was successful or not.
Comments