一个Powershell代码中的多个作业具有不同的持续时间

时间:2019-06-06 14:16:41

标签: powershell parallel-processing jobs

我有一个Powershell代码-有几个脚本块。 每个脚本块都是一项工作,我在while($true)部分中启动这些工作。 问题在于工作持续时间不同,一项工作运行约1分钟,其他工作运行7分钟。 我想连续运行这些作业,当然,我要等到作业结束后再开始新的作业。
我不想等到最长的工作结束,而是开始一份较短的新工作。 例如,如果“ job1”在1分钟内完成,但是“ job2”需要10分钟,那么我想在“ job2”过程中启动10个“ job1”。

您是否知道我该如何做到?

while($true) {

   Start-job -name somejob1 -scriptblock $block1...

   Start-job -name somejob2 -scriptblock $block2...

   ...

   Start-job -name somejobX -scriptblock $blockX..


   Get-job | Wait-job | Remove job

   Start-sleep -s 120

}

1 个答案:

答案 0 :(得分:0)

使用您当前的代码,一种可能性是仅在前一个任务完成时用几条if语句重复一次任务。

while($true) {

if ((Get-Job).Name -notcontains "startjob1") {
    Start-Job -Name "startjob1" -scriptblock $block1
}

if ((Get-Job).Name -notcontains "startjob2") {
    Start-Job -Name "startjob2" -scriptblock $block2
}

if ((Get-Job).Name -notcontains "startjob3") {
    Start-Job -Name "startjob3" -scriptblock $block3
}

Start-Sleep -Seconds 120

Get-Job -State "Completed" | Remove-Job

}

说明:

这将产生无限循环的Get-Job输出中未列出的启动作业。在启动每个作业并评估其状态之后,我们需要等待120秒才能检查作业状态。此时,将删除成功完成的作业。在传递到| Where-Object之前,可以使用Remove-Job更改此部分以检查其他状态值,因为有时作业可能会失败,并且您仍要重新运行。

通常,您可以利用Wait-Job等待作业完成或超时,以先到者为准。如果您更多地了解哪些作业运行最短,或者您知道更合适的超时时间,则可以修改超时值或对Start-Job命令重新排序。

Start-job -name somejob1 -scriptblock $block1...
Wait-Job -name somejob1 -timeout 60

Start-job -name somejob2 -scriptblock $block1...
Wait-Job -name somejob2 -timeout 60