Powershell v3 New-Job每天重复触发

问题描述 投票:0回答:9

Powershell v3 附带了所有这些新的作业调度 cmdlet。它们看起来很棒,但我在创建特定触发器时遇到困难。我需要每天运行一项作业,每小时重复一次,并保持特定的时间间隔。

使用任务计划程序 UI 很简单,但我找不到 New-JobTrigger cmdlet 的方法。

如果我使用“每日”参数集,则没有“重复”选项:

New-JobTrigger [-Daily] -At <DateTime> [-DaysInterval <Int32> ] [-RandomDelay <TimeSpan> ] [ <CommonParameters>]

如果我使用“一次”参数设置,则无法使用“每日”选项

New-JobTrigger [-Once] -At <DateTime> [-RandomDelay <TimeSpan> ] [-RepetitionDuration <TimeSpan> ] [-RepetitionInterval <TimeSpan> ] [ <CommonParameters>]

我需要的是两者的混合,但显然不起作用。例如:

New-JobTrigger -Daily -At xxxx -RepetitionDuration (New-TimeSpan -Hours 5) -RepetitionInterval (New-TimeSpan -Hours 1)

可能吗?也许为同一个工作混合多个触发器?

powershell
9个回答
6
投票

这对我有用:

注意 - 我知道原来的问题与 New-JobTrigger 有关 目的是提供一种可能的可翻译解决方案 考虑到该问题同时适用于 New-JobTrigger。

$A = New-ScheduledTaskAction -execute "powershell" -argument "-nologo -noprofile -noninteractive C:\MyScript.ps1"
$T = New-ScheduledTaskTrigger -Once -At 03:00AM 
Register-ScheduledTask -TaskName StartBasicServices_Local -Trigger $T -Action $A -description "MyScript" -User "NT AUTHORITY\SYSTEM" -RunLevel 1      
$T.RepetitionInterval = (New-TimeSpan -Minutes 5)
$T.RepetitionDuration = (New-TimeSpan -Days 1)
Set-ScheduledTask StartBasicServices_Local -Trigger $T

1
投票

我一整天都在研究这个问题,终于有了答案。你不能。无论如何都不使用这些 cmdlet。起初我认为这可能是一种解决方法:

$Job = Register-ScheduledJob -Name "YourJobName"  {Gci};
$RepeatTrigger = New-JobTrigger -Once -At (Get-Date 10:00).ToShortTimeString()  -     RepetitionInterval (New-TimeSpan -Hours 1) -RepetitionDuration (New-TimeSpan -Hours 7);
$RepeatTrigger.Frequency = [Microsoft.PowerShell.ScheduledJob.TriggerFrequency]::Daily;
Add-JobTrigger -InputObject $Job -Trigger $RepeatTrigger

然而,事实并非如此。使用跟踪命令,看起来它根据参数集验证属性。使用 schtasks 时也是如此:

schtasks /create /tn YourTask /tr notepad.exe /sc Hourly 

它将每小时创建一次,但同样它必须是一次性任务。从表面上看,有一个用于 COM API 的 .Net 包装器,如果您不熟悉 PoSH,这可能是您最好的选择。您可以在CodePlex上找到它。


1
投票

我知道 Add-JobTrigger,但我不明白如何实现我的 具体要求:每天运行一项作业,每小时重复一次, 在特定的持续时间内。例如:每天上午 10 点,重复 每 1 小时一班,直至下午 5 点。 – 斯卡穆加 2012 年 10 月 7 日 18:14

使用 Register-ScheduledJob 创建作业。 然后添加每日触发器。 如果我们能做到这一点那就太好了,但是 -Daily 在 PowerShell 4.0 中不起作用。 请继续阅读,我为您提供了替代方案。

# Technet: http://technet.microsoft.com/en-us/library/hh849759.aspx
# To create a repeating schedule, use the Once parameter with the RepetitionDuration and RepetitionInterval parameters.
# -RepetitionInterval Repeats the job at the specified time interval. For example, if the value of this parameter is 2 hours, the job is triggered every two hours.
#  The default value, 0, does not repeat the job.
# -RepetitionDuration Repeats the job until the specified time expires. The repetition frequency is determined by the value of the RepetitionInterval parameter. 
#  For example, if the value of RepetitionInterval is 5 minutes and the value of RepetitionDuration is 2 hours, the job is triggered every five minutes for two hours.
#
$trigger = New-JobTrigger -Daily -At 10:00 -RepetitionDuration 7:00:00 -RepetitionInterval 1:00:00 -DaysofWeek 
Register-ScheduledJob -Name Test -Trigger $trigger -ScriptBlock {}

您可以组织您的工作,以便它在您想要的每个小时都有一个触发器。

$trigger4am  = New-JobTrigger -Daily -At 04:10
Register-ScheduledJob -Name ArchiveProd -Trigger $trigger4am -ScriptBlock {E:\ArchiveProd.ps1}

$trigger8am  = New-JobTrigger -Daily -At 08:10
$trigger12pm = New-JobTrigger -Daily -At 12:10
$trigger6pm  = New-JobTrigger -Daily -At 18:10
Add-JobTrigger -Trigger $trigger8am  -Name ArchiveProd
Add-JobTrigger -Trigger $trigger12pm -Name ArchiveProd
Add-JobTrigger -Trigger $trigger6pm  -Name ArchiveProd

希望这是您所需要的。它非常适合我的情况,尽管我更愿意只添加 Daily 参数。也许有人可以帮我改进这个?


1
投票

答案很晚,但我从这个问题开始,然后进行了更多搜索,并在此链接,Petri.com

找到了解决方案
$principal = New-ScheduledTaskPrincipal -UserID MyDomain\MyGMSA$ -LogonType Password -RunLevel Highest
$action = New-ScheduledTaskAction  "E:\DoSomething"
$when = New-ScheduledTaskTrigger -Daily -At "00:02" -DaysInterval 1

Register-ScheduledTask -TaskName MyNewTask–Action $action –Principal $principal -Trigger  $when

$t = Get-ScheduledTask -TaskName MyNewTask

$t.Triggers.repetition.Interval = "PT15M"    #every 15 mins
$t.Triggers.repetition.Duration = "PT7H30M" #for 7 hours 30
$t | Set-ScheduledTask

0
投票

尝试使用

Add-JobTrigger
将多个作业触发器添加到计划作业中。


0
投票
clear
Import-Module TaskScheduler 

# Create a new task 
$task = New-Task 


Add-TaskAction -Task $task -Path "C:\Windows\notepad.exe"   
Add-TaskTrigger -Task $task -Daily -At "06:00" -Repeat "05:00" -For "12:00" 

# Register the task 
Register-ScheduledTask -Name "PowerShell - MyScript.ps1" -Task $task

Get-ScheduledTask PowerShell* | select -Property Name
# Remove-Task -n Power*

0
投票

您可以创建多个触发器,见下文:

$job = Register-ScheduledJob -Name "Test1" -FilePath "C:\temp\script.ps1"
$triggers = New-Object System.Collections.Generic.List[Microsoft.PowerShell.ScheduledJob.ScheduledJobTrigger]
$times = ("08:00", "09:00", "10:00", "11:00", "12:00", "14:00", "15:00", "16:00", "17:00", "19:00", "22:00")
foreach($t in $times){
$triggers.Add((New-JobTrigger -Daily -At $t))
}
$job.AddTriggers($triggers, $true)

或更容易(但更慢)

$MyJob = Register-ScheduledJob -Name "MyJob" -FilePath "C:\temp\test.ps1"
$times = ("08:00", "09:00", "10:00", "11:00", "12:00", "14:00", "15:00", "16:00", "17:00", "19:00", "22:00")
foreach($t in $times){$MyJob | Add-JobTrigger -trigger (New-JobTrigger -Daily -At $t)}

0
投票

当您使用“Register-ScheduledJob”创建计划作业时,您无法将每日执行与重复间隔一起配置。即使您手动修改 ScheduledJobTrigger 对象的属性“RepetitionInterval”和“RepetitionDuration”,触发器也会配置为每天执行或重复执行一次。 我通过

Get-ScheduledTask
方法获取作业对应的任务并修改那里的触发器来成功配置它:

 $trigger = New-JobTrigger -Weekly -WeeksInterval 1 -At "06:00" -DaysOfWeek 星期一、星期二、星期三、星期四、星期五
    Register-ScheduledJob -Name $cronjobName -Trigger $trigger -ScriptBlock $scriptBlock
    $task = Get-ScheduledTask -TaskName $cronjobName
    $trigger = $task.触发器
    $trigger.Repetition.Interval = "PT10M"
    $trigger.Repetition.Duration = "PT12H"
    设置ScheduledTask -TaskPath $task.TaskPath -TaskName $cronjobName -Trigger $trigger

0
投票

New-ScheduledTaskTrigger cmdlet 有一个不合理的限制,即不同时支持 -Daily 选项和 Repetition 选项。但事实证明,您可以重写生成的 PowerShell 对象的 Repetition 元素,如下所示。

本质上,您创建了两次触发器对象。第一次,请使用重复选项指定 -Once 标志。然后,将生成的触发器的重复元素保存在变量中。然后,使用 -Daily 选项创建第二个触发器对象。最后,用第一个触发器中保存的重复元素覆盖第二个触发器的重复元素。

# Construct the first trigger with a 30 minute repetition interval
$interval = New-TimeSpan -Minutes 30
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval $interval

# Save off the repetition element of the resulting trigger object
$repetition=$trigger.Repetition

# Recreate the trigger with the -Daily option, specifying a start TOD
$trigger = New-ScheduledTaskTrigger -Daily -At 12am

# Finally, overwrite the Repetition element with the saved repetition from earlier.
$trigger.Repetition=$repetition

# Now you can specify the final trigger object as your daily, recurring trigger.
# This worked in Windows 10 and Windows 11.
© www.soinside.com 2019 - 2024. All rights reserved.