Повторно отправить зависшее задание (начальное задание)

Я запускаю несколько заданий (с помощью Start-Job), и в конце моего сценария я проверяю, выполнялись ли задания более X секунд. Затем я хотел бы взять задания Running и Failed и перезапустить их, пока они не добьются успеха.

Задания названы в честь сервера, с которым я хочу работать (например, с помощью Test-Connection). Моя проблема в том, что я не могу понять, как повторно отправить работу!

get-job | where { $_.state -eq "running" } | remove-job -force | start-job -ScriptBlock { echo $_ }
  • Как я могу передать имя неудачного/зависшего задания(й) новому заданию, которое я запускаю?
  • Как я могу дождаться завершения задания по удалению, прежде чем продолжить работу с Start-Job?

С уважением:)


person Sune    schedule 16.03.2012    source источник


Ответы (1)


Один из способов перезапуска неудачных заданий:

Start-Job -Name Foo -ScriptBlock {
    $ErrorActionPreference = 'Stop'
    Get-Item C:\DoesNotExists 
} | Wait-Job > $null

Get-Job | ? { $_.State -eq 'Failed' } | % {
    Start-Job -Name $_.Name -ScriptBlock { iex $args[0] } -ArgumentList $_.Command | Wait-Job | Receive-Job
}
person Andy Arismendi    schedule 16.03.2012
comment
Ах! Конечно, мне не нужно беспокоиться об удалении неудачных заданий! Что делает IEX? Это как я повторно представить с тем же именем? - person Sune; 17.03.2012
comment
@Sune iex — это псевдоним Invoke-Expression. Текст блока сценария неудавшегося задания передается новому заданию в виде строки. Invoke-Expression используется для обработки строки как команды. Я обновил его, чтобы показать вам, как вы можете повторно использовать имя задания. - person Andy Arismendi; 17.03.2012