Используя ваш текущий код, одна возможность состоит в том, чтобы только повторить задание, когда предыдущий завершается с несколькими 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