简体   繁体   中英

Updating Scheduled Task Script from Powershell

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.

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 

刚刚发布的PowerShell中进行了更新,包括Unregister-ScheduledJob所看到这里

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM