从Powershell更新计划任务脚本

时间:2014-08-26 21:06:01

标签: windows powershell scheduled-tasks

我正在尝试编写一个每天运行一次的Powershell脚本。它将执行的众多功能之一是确保脚本本身是最新的。我的问题是,因为我对脚本进行了版本控制,所以我需要更新我在脚本中创建的计划任务。

我在这里考虑了两种不同的方法,其中我无法弄清楚:

  1. 我最初认为我可以简单地为我的Task获取ScheduledTask对象,并在那里更新文件路径。我最终无法进入这条道路。
  2. 我的下一个想法是我可以简单地调用Unregister-ScheduledTask -TaskName "mytask",然后调用Register-ScheduledTask并使用新路径重新创建它。
  3. 在选项1失败后,我坚持执行选项2.我能够找到并取消注册我的任务,但在尝试使用新路径注册时,我收到以下错误:

    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
    

    修改: 为了澄清,我的预定任务路径类似于,C:\ Apps \ myscript_v0.0.1.ps1因此,当我更新时,它将变为C:\ Apps \ myscript_v0.1.5.ps1或者其他什么,我需要运行新版本,而不是目前的旧版本。

2 个答案:

答案 0 :(得分:6)

好的,更改作业的文件路径很简单。首先我们得到这个工作,然后我们将scheduledjob对象传递给Set-ScheduledJob并指定-FilePath

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

修改:要在信用到期时给予信用,我要感谢Get-Help *-ScheduledJob后跟Get-Help Set-ScheduledJob -Full和示例1,以了解这一情况... < / p>

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

答案 1 :(得分:1)

刚刚发布的PowerShell已更新为包含Unregister-ScheduledJob here