Мне удалось «перебросить» исключение в главном потоке, используя:
Receive-Job $job -ErrorAction Stop
В качестве примера я приведу свой вариант использования.Его можно легко применить к OP.
$code = {
$Searcher = New-Object -ComObject Microsoft.Update.Searcher
#Errors from Search are not terminating, but will be present in the output none the less.
$Results = $Searcher.Search('IsInstalled=0 and IsHidden=0')
$Results.Updates
};
$job = Start-Job -ScriptBlock $code;
$consume = Wait-Job $job -Timeout 600;
if ($job.state -eq 'Running') {
Stop-Job $job
throw 'Windows update searcher took more than 10 minutes. Aborting'
};
#Captures and throws any exception in the job output
Receive-Job $job -ErrorAction Stop;
Write-Host "Finished with no errors"; #this will not print if there was an error
Работает в версии 2.0.
Обратите внимание, что если ошибка в задании не прекращается, последующие строки продолжат выполняться,Но это не будет очевидно в выводе, возвращаемом из Receive-Job, так как Receive-Job «завершает работу на полпути» - он выбрасывает сам при обнаружении объекта ошибки.
Один из способов избежатьто есть обернуть весь блок в try {} catch {throw;}
Кроме того, состояние задания не будет «Failed», если исключение не завершается