4

I'm attempting to write a Powershell script that runs once a day. One of the many functions it will perform is to make sure that the script itself is up to date. My problem is that since I version the scripts, I need to update the scheduled task I create from within the script.

I've thought about 2 different approaches here, of which I can't figure out either:

  1. I initially thought I could simply get the ScheduledTask object for my Task, and update the file path there. I was ultimately unable to access the path.
  2. My next thought was I could simply call Unregister-ScheduledTask -TaskName "mytask" and then afterwards Register-ScheduledTask and recreate it with the new path.

After failing Option 1, I'm stuck on the execution of Option 2. I am able to find and Unregister my Task, but when attempting to register it with the new path I receive the following error:

Register-ScheduledJob : The scheduled job definition <myTask> already exists in the job definition store.
At line:3 char:1
+ Register-ScheduledJob -Name "<myTask>" -FilePath "C:\Apps\\Uploade ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (Microsoft.Power...edJobDefinition:ScheduledJobDefinition) [Register-ScheduledJob], ScheduledJobException
    + FullyQualifiedErrorId : CantRegisterScheduledJobDefinition,Microsoft.PowerShell.ScheduledJob.RegisterScheduledJobCommand

Edit: To clarify, my Scheduled task path is something like, C:\Apps\myscript_v0.0.1.ps1 As a result, when I update, it will become C:\Apps\myscript_v0.1.5.ps1 or whatever, and I need to run the new version as opposed to old one that is currently the target.

4
  • Why not keep the path to the live script constant, and track version history elsewhere? < Why does the path need to change? Commented Aug 26, 2014 at 21:07
  • @noam Added clarification, see my edit Commented Aug 26, 2014 at 21:10
  • Do you have a scheduled task, or a scheduled job? Click here for more info (The Scripting Guys blog link). Commented Aug 26, 2014 at 21:28
  • @TheMadTechnician I cannot believe I messed that up, thank you for catching that. I had registered a Job, but unregistered a Task and tried reregistering another job which obviously doesnt work haha. I'll leave this up in hopes someone might provide a solution to simply updating the file without jumping through registration hoops. Just in case if you want to add your comment as an answer I can accept it in a few days if there are no other bites. Commented Aug 26, 2014 at 21:43

2 Answers 2

7

Ok, changing the job's file path is easy. First we get the job, then we pipe that scheduledjob object to Set-ScheduledJob and specify the -FilePath

$NewPath = GCI C:\Apps\myscript_*.ps1 | Select -last 1 -ExpandProperty FullName
Get-ScheduledJob MyJob | Set-ScheduledJob -FilePath $NewPath

Edit: To give credit where credit is due, I would like to thank Get-Help *-ScheduledJob followed by Get-Help Set-ScheduledJob -Full and Example 1 for going through this exact situation...

Example 1: Change the script that a job runs

The first command uses the Get-ScheduledJob cmdlet to get the Inventory 
scheduled job. The output shows that the job runs the Get-Inventory.ps1 
script.This command is not required; it is included only to show the 
effect of the script change.

PS C:\>Get-ScheduledJob -Name Inventory
Id         Name            Triggers        Command                                  Enabled
--         ----            --------        -------                                  -------
1          Inventory       {1}             C:\Scripts\Get-Inventory.ps1             True

The second command uses the Get-ScheduledJob cmdlet to get the Inventory
scheduled job. A pipeline operator (|) sends the scheduled job to the 
Set-ScheduledJob cmdlet. The Set-ScheduledJob command uses the Script 
parameter to specify a new script, Get-FullInventory.ps1. The command
uses the Passthru parameter to return the scheduled job after the change.

PS C:\>Get-ScheduledJob -Name Inventory | Set-ScheduledJob -FilePath C:\Scripts\Get-FullInventory.ps1 -Passthru
Sign up to request clarification or add additional context in comments.

1 Comment

Welp now I feel like an idiot. Always good to learn something new haha! Thanks a ton.
1

Just posting as PowerShell was updated to include Unregister-ScheduledJob as seen here

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.